【发布时间】:2017-06-27 14:35:36
【问题描述】:
假设我们有这个玩具 data.table
prueba <- data.table(id=c(1,1,1,1,2,2,3,3,4), kk=c("FA", "N","N","N",NA,"FA","N", "FA", "N"), rrr=1:9)
id kk rrr
1 FA 1
1 N 2
1 N 3
1 N 4
2 NA 5
2 FA 6
3 N 7
3 FA 8
4 N 9
如果该 id 在 kk 列上包含任何“FA”值,我们希望检索与给定“id”相关的所有行。
我必须这样做:
prueba[id %in% prueba[,any(kk=="FA", na.rm=T),
by=id]$id[prueba[,any(kk=="FA", na.rm=T),by=id]$V1],]
id kk rrr
1 FA 1
1 N 2
1 N 3
1 N 4
2 NA 5
2 FA 6
3 N 7
3 FA 8
(我们得到所有 id=1,2 和 3 的行)。
但我觉得太长了,没有优化。
如何使用 data.table 轻松完成?
【问题讨论】:
-
通过连接,您可以使用
prueba[prueba[kk == "FA", .(id)], on="id"]或使用unique,如果每个 ID 有多个 FA 实例:prueba[unique(prueba[kk == "FA", .(id)]), on="id"]。 -
你也可以使用
prueba[, if(any(kk == "FA")) .SD, by= id] -
prueba[id %in% unique(prueba[kk == "FA", id])]也可以。 -
@docendodiscimus 我发现您的解决方案是最简单的。如果您将其发布为答案,我会选择它。
-
@skan,请随时自行发布,也许与 cmets 中的其他建议一起发布
标签: r data.table