给定年份没有因子水平组合不适用的数据子集

Subset of data where no factor level combination is NA for a given year

我不仅想要数据不遗漏给定年份的观察结果,而且还希望不使用该年份的其他治疗数据。我还有其他因素(并且它们在站点之间并不完全一致)但这里有一个仅包含站点和 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"])

但这给我留下了像站点 a 中的 1 年那样的产量数据,而当它缺少一个 trt 时。我如何使用 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?

中的密度函数吗

查看由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)]