【问题标题】:R: Cross-referencing columns/reverse lookupR:交叉引用列/反向查找
【发布时间】:2018-07-09 17:29:26
【问题描述】:

我已经找到了解决方案,但怀疑必须有更自然或惯用的方式。给定一个包含许多站点几年内的许多观测数据的数据集,按站点列出每个站点活跃的年份——应该是微不足道的。数据大致如下:

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 的值”?

另外一个问题是,我是从一个由

创建的每年 dfs 列表开始的
dfList <- lapply(fileList, readDelimFunc)

出于其他目的,我对此更满意,但是对于这项任务,额外的组织层让我立刻感到困惑,所以我将它们混合在一起。是否也可以(合理地)从该 dfs 列表中生成所需的列表,或者这很荒谬吗?

【问题讨论】:

  • with(data,tapply(YEAR,STATION,unique))
  • @BrianDavis T申请!叹; Xapply 未采取。非常感谢。我最终会明白这一点的——我敢肯定......
  • 你得到了这个@uhClem

标签: r subset reverse-lookup


【解决方案1】:

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 解决方案也不是“矢量化的”)。

最好不要拘泥于寻找最佳解决方案,而应寻找最合理的解决方案。

【讨论】:

  • 感谢 dplyr,我几乎没有接触过它。同意专注于感官——我还远远没有担心优化;在计算函数式语言的语义几何方面,我似乎比我预期的要困难得多。
猜你喜欢
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2019-09-05
相关资源
最近更新 更多