r语言 - 根据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

我想是数据。表是空的,因为没有行V1等于A和B,但我没有尝试过接近。

这就是我想说的:

# id V1 V2
# 1: 100  A NA
# 2: 100  B NA

我想我需要在这里以某种方式包括id信息,但我不清楚如何,因为添加by =不起作用

您可以选择同时具有'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

我推荐使用@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

也许我没有得到你想要的,但是你试过这种方法吗?

dat[(V1 %in% c("A", "B") & is.na(V2)),]

最新更新