r - 根据 data.table 中附加列中的条件对同一列中的多行进行子集化

标签 r data.table filtering data-manipulation

我正在尝试使用 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))

我想要做的是查找给定 id 的 A 和 B 均为 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 AND 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

关于r - 根据 data.table 中附加列中的条件对同一列中的多行进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68561847/

相关文章:

r - 使用 stringdist_join 连接多列

r - 如何使用预测包中的 auto.arima() 函数提取模型拟合的名称?

r - 在 ggvis 图中隐藏工具提示初始化为 ="click"

r - 在函数内通过引用向 data.table 添加新列并不总是有效

kotlin - 如何使用谓词列表过滤集合

php - 如何比较两个二维数组中的行?

根据条件替换列表中的值

r - 如何将 data.table::fread 包装在你自己的包中,具有 bit64 功能?

r - 新的 data.table 列返回连续第 n 个最大值

python - Django 中过滤内的正则表达式