数据子集,其中没有因子级别组合为给定年份的NA

时间:2017-09-20 22:47:39

标签: r apply reshape

我希望数据不仅没有错过某一年的观察结果,而且对于其他治疗方法也是如此。从那年起不使用的数据。我还有其他因素(并且它们并非所有网站都一致),但这里只是网站和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。我怎样才能使用像申请或每年获得完整案例的东西? 我想的第一件事就是施放,然后以某种方式做完成。

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。所以接下来:

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

如何使用它来摆脱每个FALSE的trt site 年度因素组合? 现在通常使用数据框,然后您可以使用逻辑向量来摆脱您不想要的东西。但是我没有经验,也无法找到如何将其应用到上面的df版本的数组中的答案,例如(complete.cases(ok[,"yield"])。如何通过因子组合(by(ok[, 2:3], ok[,"years"], complete.cases不起作用)或在阵列上完成案例?还是有更简单的东西?我可以在this question?

中用完整的案例替换密度函数

1 个答案:

答案 0 :(得分: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)]