代码之家  ›  专栏  ›  技术社区  ›  buhtz

删除列表中的行数据框出现在另一个数据框按rowname()作为id

r
  •  0
  • buhtz  · 技术社区  · 7 年前

    我知道有一些类似的问题。但他们的答案对我的情况没有帮助,或者我理解错了。

    set.seed(0)
    
    df <- data.frame(A = seq(20),
                     B1 = sample(c(T, F), 20, replace=T),
                     B2 = sample(c(T, F), 20, replace=T))
    
    rownames(df) <- df$A
    df <- df[, c('B1', 'B2'), drop = FALSE]
    
    result <- df[df$B1 == FALSE & df$B2 == FALSE, ]
    
    print(result)
    

    结果是

    > result
          B1    B2
    1  FALSE FALSE
    4  FALSE FALSE
    10 FALSE FALSE
    16 FALSE FALSE
    18 FALSE FALSE
    

    df 没有 rownames() 或命名行。所以有名字的行 1, 4, 10, 16, 18 应在不导致其他行重命名的情况下删除。

    我的尝试(基于其他答案):

    > library(dplyr)
    > anti_join(df, result)
    Joining, by = c("B1", "B2")
          B1    B2
    1   TRUE FALSE
    2   TRUE  TRUE
    3  FALSE  TRUE
    4   TRUE  TRUE
    5  FALSE  TRUE
    6  FALSE  TRUE
    7  FALSE  TRUE
    8   TRUE  TRUE
    9   TRUE  TRUE
    10  TRUE FALSE
    11 FALSE  TRUE
    12  TRUE  TRUE
    13  TRUE FALSE
    14 FALSE  TRUE
    15  TRUE FALSE
    

    这里的行名不正确。它们只是从1到15。

    > setdiff(df, result)
         B1    B2
    1  TRUE FALSE
    2  TRUE  TRUE
    3 FALSE  TRUE
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Ronak Shah    7 年前

    一个带有 setdiff 可能是:

    df[setdiff(rownames(df), rownames(result)), ]
    
    #      B1    B2
    #2   TRUE FALSE
    #3   TRUE  TRUE
    #5  FALSE  TRUE
    #6   TRUE  TRUE
    #7  FALSE  TRUE
    #8  FALSE  TRUE
    #9  FALSE  TRUE
    #11  TRUE  TRUE
    #12  TRUE  TRUE
    #13  TRUE FALSE
    #14 FALSE  TRUE
    #15  TRUE  TRUE
    #17  TRUE FALSE
    #19 FALSE  TRUE
    #20  TRUE FALSE
    

    然而,我建议的一种更普遍的方法是只计算一次指数并使用它们。

    inds <- df$B1 == FALSE & df$B2 == FALSE
    result <- df[inds, ]
    output <- df[!inds, ]
    
        2
  •  2
  •   akrun    7 年前

    我们可以用 %in% 具有 !

    df[!rownames(df) %in% rownames(result),]