【问题标题】:Subsetting multiple rows from same column based on condition in additional column in data.table根据 data.table 中附加列中的条件从同一列中对多行进行子集
【发布时间】:2021-10-04 06:43:48
【问题描述】:

我正在尝试获取我的数据子集,其中包含单个列的两个不同值,这些值与使用 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 = 不起作用

【问题讨论】:

    标签: r data.table filtering data-manipulation


    【解决方案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
    

    【讨论】:

    • 还有dat[is.na(V2), .SD[all(c("A", "B") %chin% V1)], id]
    【解决方案2】:

    我建议使用@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
    

    【讨论】:

      【解决方案3】:

      也许我没有得到你需要的东西,但你试过这种方式吗?

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

      【讨论】:

      • 我尝试了类似的方法,但没有括号。当我添加括号时,我仍然得到包含额外 id 的相同输出(在上面的示例中为 101 和 103)
      猜你喜欢
      • 1970-01-01
      • 2020-09-09
      • 2019-11-16
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      相关资源
      最近更新 更多