代码之家  ›  专栏  ›  技术社区  ›  uhClem

R: 交叉引用列/反向查找

  •  0
  • uhClem  · 技术社区  · 7 年前

    我已经找到了一种解决方法,但我怀疑一定有一种更自然或更习惯的方法。给定一个数据集,该数据集包含许多台站多年来的许多观测结果,按台站列出每个台站活跃的年份——应该很简单。数据大致如下:

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

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

    dfList <- lapply(fileList, readDelimFunc)
    

    我很高兴有其他目的,但对于这项任务,额外的组织层让我很困惑,所以我把它们混合在一起。所需的列表是否也可以(正常地)从dfs列表中生成,或者这是荒谬的?

    1 回复  |  直到 7 年前
        1
  •  0
  •   thc    7 年前

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

    最好不要为寻找最理想的解决方案而烦恼,而是寻找最感性的解决方案。