我已经找到了解决方案,但怀疑必须有一种更自然或惯用的方式。给定一个包含许多站点几年内的许多观测数据的数据集,按站点列出每个站点活跃的年份——应该是微不足道的。数据大致如下:
set.seed(668)
yrNames <- seq(1995,2015)
staNames <- c(LETTERS[1:12])
trpNames <- seq(1,6)
years <- rep(yrNames, times=rep(sample(1:4, length(yrNames), replace=TRUE)))
stations <- sample(staNames, length(years), replace=TRUE)
traps <- sample(trpNames, length(years), replace=TRUE)
data <- data.frame(YEAR=years, STATION=stations, TRAP=traps)
经过太多小时(努力思考矢量,避免循环)后,我终于努力做到:
library("reshape2")
bySta <- dcast(data, YEAR ~ STATION)
sapply(bySta, function(x){ return(bySta$YEAR[x > 0])})
这给出了我想要的:
# $YEAR
# [1] 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
# [16] 2010 2011 2012 2013 2014 2015
# $A
# [1] 2002 2009 2015
# $B
# [1] 1996 1999 2003 2007 2013
# $C
# [1] 2000 2002 2005 2006 2009 2010 2014
# # [...]
但是到达那里远非直觉,有各种各样的死胡同。有没有办法更简单地说“列出我所有 df$x 每个 df$y 的值”?
一个额外的问题是,我是从一个由 a 创建的每年 dfs 列表开始的
dfList <- lapply(fileList, readDelimFunc)
出于其他目的,我对此更满意,但是对于这项任务,额外的组织层让我立刻感到困惑,所以我将它们混合在一起。是否也可以(合理地)从该 dfs 列表中生成所需的列表,或者这很荒谬吗?