给定年份没有因子水平组合不适用的数据子集
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?
中的密度函数吗
查看由year
和site
的组合定义的每个组,只保留没有任何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)]
我不仅想要数据不遗漏给定年份的观察结果,而且还希望不使用该年份的其他治疗数据。我还有其他因素(并且它们在站点之间并不完全一致)但这里有一个仅包含站点和 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?
查看由year
和site
的组合定义的每个组,只保留没有任何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)]