我找到了解决方案,但怀疑必须有更自然或惯用的方法。鉴于多年来在许多站点进行了多年观测的数据集,请按站点列出每个站点的活动年份 - 应该是微不足道的。数据大致如此:
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 $ y的值列出我所有的df $ x”?
额外的皱纹是我从一个由
创建的每年dfs列表开始dfList <- lapply(fileList, readDelimFunc)
我为其他目的而感到高兴但是为了完成这项任务,额外的组织层让我立刻感到困惑,所以我将它们拼凑成一个。是否可以从这个dfs列表(理所当然地)生成所需的列表,还是那么荒谬?
答案 0 :(得分:0)
dplyr解决方案:
data %>% group_by(STATION) %>% summarize(years = list(unique(YEAR))) %>% as.data.frame
结果:
STATION years
1 A 2002, 2009, 2015
2 B 1996, 1999, 2003, 2007, 2013
3 C 2000, 2002, 2005, 2006, 2009, 2010, 2014
4 D 2003, 2005, 2010, 2014
5 E 1997, 2005
6 F 1996, 1997, 1998, 2001, 2014, 2015
7 G 1996, 2001
8 H 1995, 1997, 2003
9 I 1996, 1997, 2008
10 J 1999, 2001, 2009
11 K 2003, 2004, 2010, 2011, 2012
12 L 2002, 2004, 2011, 2015
请注意,Xapply循环实际上并非“向量化”,它们只是正常R函数调用迭代的包装器。 (这种dplyr解决方案也没有“矢量化”)。
最好不要挂断寻找最佳解决方案,而是找到最灵敏的解决方案。