提问人:HarD 提问时间:7/28/2021 更新时间:7/28/2021 访问量:399
根据 data.table 中附加列中的条件对同一列中的多行进行子集化
Subsetting multiple rows from same column based on condition in additional column in data.table
问:
我正在尝试获取数据的子集,其中包含单个列的两个不同值,这些值与使用 data.table 的第二列匹配。
这感觉是一项相当微不足道的任务,但我在任何地方都找不到这样的例子:
library(data.table)
dat <- data.table(id = c("100", "100", "101", "101", "101", "103", "105", "105"),
V1 = c("A", "B", "A", "B", "C", "B", "A", "B"),
V2 = c(NA, NA, 20, NA, 30, NA, 30, 30))
我想做的是找到 A 和 B 对于给定 id 都是 NA 的所有实例。
我可以很容易地获得任何一个为真的 id:
dat[(V1 == "A" & is.na(V2)) | (V1 == "B" & is.na(V2)), ] # works as expected
# id V1 V2
# 1: 100 A NA
# 2: 100 B NA
# 3: 101 B NA
# 4: 103 B NA
dat[V1 %in% c("A", "B") & is.na(V2), ] # same as above
但是,如果我尝试将调用与 & 结合起来,它就不起作用
dat[(V1 == "A" & is.na(V2)) & (V1 == "B" & is.na(V2)), ] # empty data table
dat[(V1 == "A" & is.na(V2)) && (V1 == "B" & is.na(V2)), ] # empty data table
我想 data.table 是空的,因为没有 V1 等于 A 和 B 的行,但我尝试过的任何东西都无法接近。
这就是我想要得到的:
# id V1 V2
# 1: 100 A NA
# 2: 100 B NA
我想我需要以某种方式在此处包含 id 信息,但我不清楚如何,因为添加不起作用by =
答:
4赞
Ronak Shah
7/28/2021
#1
您可以选择那些同时具有 和 值的组,并且它们都是 。'A'
'B'
NA
library(data.table)
dat[, .SD[all(c('A', 'B') %in% V1 & is.na(V2[match(c('A', 'B'), V1)]))], id]
# id V1 V2
#1: 100 A NA
#2: 100 B NA
评论
0赞
chinsoon12
7/29/2021
以及dat[is.na(V2), .SD[all(c("A", "B") %chin% V1)], id]
0赞
Ubiminor
7/28/2021
#2
也许我没有得到你需要的东西,但你试过这种方式吗?
dat[(V1 %in% c("A", "B") & is.na(V2)),]
评论
0赞
HarD
7/28/2021
我尝试了类似的东西,但没有括号。当我添加括号时,我仍然得到相同的输出,其中包含额外的 id(在上面的示例中为 101 和 103)
1赞
D.J
7/28/2021
#3
我建议使用 @Ronak Shah 的答案 - 我只是添加这个,因为它很有趣,如果你(像我一样)仍在努力理解数据表语法,可能会更容易理解
dat <- data.frame(id = c("100", "100", "101", "101", "101", "103", "105", "105"),
V1 = c("A", "B", "A", "B", "C", "B", "A", "B"),
V2 = c(NA, NA, 20, NA, 30, NA, 30, 30))
dat <- dat[(dat$V1 == "A" & is.na(dat$V2)) | (dat$V1 == "B" & is.na(dat$V2)), ]
#find all id's that exist more than once
non_unique<-as.data.frame(table(dat$id))
non_unique<-non_unique[non_unique$Freq>1,]
dat<-dat[dat$id %in% as.character(non_unique[,1]),]
dat
id V1 V2
1 100 A NA
2 100 B NA
上一个:按组删除每列中的 NA
评论