【问题标题】:Subset of data where no factor level combination is NA for a given year给定年份没有因子水平组合为 NA 的数据子集
【发布时间】:2017-09-20 22:47:39
【问题描述】:

我希望数据不仅不会丢失给定年份的观察结果,而且还希望不使用该年份的其他治疗数据。我还有其他因素(并且它们在站点之间并不完全一致),但这里有一个示例,只是站点和 trt 组合。这很典型,因为行数也不同。

ok1<-data.frame(year=(c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)),
                yield=c(NA,65,NA,45,34,65,43,88,NA,33,23,11,23,54,12),
                trt=c("ct","nt","dt"), site="a")
ok2<-data.frame(year=(c(1,1,1,2,2,2,3,3,3,4,4,4)),
                yield=c(21,22,23,NA,34,65,43,86,39,36,43,41),
                trt=c("ct","nt","dt"), site = "b")
ok<-rbind(ok1,ok2)

当然,我可以要求像

这样的逻辑向量
complete.cases(ok[,"yield"])

但是当它丢失一个 trt 时,这给我留下了像站点 a 中的 1 这样的产量数据年份。我如何使用 apply 或 by 之类的东西来获取每年的完整案例? 我想到的第一件事是投射,然后以某种方式完成 complete.cases:

okc<-cast(ok, year~trt~site, value="yield")

站点 b 的数据看起来像

> okc
...
, , site = b

     trt
years ct dt nt
    1 21 23 22
    2 NA 65 34
    3 43 39 86
    4 36 41 43

所以我想完全摆脱站点 b 的第 2 年。那么接下来:

okl<-apply(okc,3,complete.cases) #data is complete on 3rd dimension, i.e for a given year at a given site

我如何使用它来消除每个 FALSE 的 trtsiteyear 因子组合? 现在通常使用数据框,然后您可以使用逻辑向量来摆脱您不想要的东西。但是我没有经验,也找不到关于如何将其应用回数组的答案,例如上面的 df 版本,例如(complete.cases(ok[,"yield"])。如何通过因子组合(by(ok[, 2:3], ok[,"years"], complete.cases 不起作用)或在数组上完成案例?或者有什么更简单的吗?我可以用完整的案例代替this question?中的密度函数吗?

【问题讨论】:

    标签: r apply reshape


    【解决方案1】:

    查看由yearsite 组合定义的每个组,只保留没有任何NA 值的组:

    ok[with(ok, ave(is.na(yield), list(year,site), FUN=sum)==0 ),]
    
    #   year yield trt site
    #4     2    45  ct    a
    #5     2    34  nt    a
    #6     2    65  dt    a
    #10    4    33  ct    a
    #11    4    23  nt    a
    #12    4    11  dt    a
    #13    5    23  ct    a
    #14    5    54  nt    a
    #15    5    12  dt    a
    #16    1    21  ct    b
    #17    1    22  nt    b
    #18    1    23  dt    b
    #22    3    43  ct    b
    #23    3    86  nt    b
    #24    3    39  dt    b
    #25    4    36  ct    b
    #26    4    43  nt    b
    #27    4    41  dt    b
    

    如果您的数据量很大,请考虑使用data.table 来提高速度:

    library(data.table)
    setDT(ok)
    ok[, if(!any(is.na(yield))) .SD, by=.(year,site)]
    

    【讨论】:

    • 这可以满足我的需要,但是随着“列表”中因子数量的增加,运行时间会呈指数增长。经过时间从 2 个因素的 0.02 到 3 个因素的 1.44 到 4 个因素的 130.71。如果我有更多因素,有什么方法可以提高效率吗?谢谢
    • @Anomie - 如果您要处理大量组/因素,请尝试 data.table。马上查看我的编辑。
    • 巨大的差异,基本上是即时的。
    猜你喜欢
    • 2013-10-12
    • 1970-01-01
    • 2014-03-21
    • 2015-01-27
    • 1970-01-01
    • 2018-09-17
    • 2022-01-01
    相关资源
    最近更新 更多