【问题标题】:Remove the rows of data frame whose cells match a given vector删除单元格与给定向量匹配的数据框行
【发布时间】:2012-06-15 18:44:03
【问题描述】:

我有不同数量的列和行的大数据框。我会在数据框中搜索给定向量的值,并删除与给定向量的值匹配的单元格行。我想把它作为一个函数,因为我必须在可变行和列的多个数据帧上运行它,并且我想避免 for 循环。

例如

ff<-structure(list(j.1 = 1:13, j.2 = 2:14, j.3 = 3:15), .Names = c("j.1","j.2", "j.3"), row.names = c(NA, -13L), class = "data.frame")

删除所有单元格包含值8,9,10的行

我想我可以使用ff[ !ff[,1] %in% c(8, 9, 10), ]subset(ff, !ff[,1] %in% c(8,9,10) )

但为了从数据集中删除所有值,我必须解析每一列(可能使用for 循环,我希望避免这种情况)。

还有其他(更清洁的)方法吗?

非常感谢

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    我认为apply 策略可能是最经济的,但也可以执行以下任一策略:

     ff[ !rowSums( sapply( ff, function(x) x %in% 8:10) ) , ]
    ff[ !Reduce("+", lapply( ff, function(x) x %in% 8:10) ) , ]
    

    逻辑向量的向量加法,(相当于any)后跟否定。我怀疑第一个会更快。

    【讨论】:

      【解决方案2】:

      apply你对每一行的测试:

      keeps <- apply(ff, 1, function(x) !any(x %in% 8:10))
      

      给出一个布尔向量。然后用它子集:

      ff[keeps,]
      
         j.1 j.2 j.3
      1    1   2   3
      2    2   3   4
      3    3   4   5
      4    4   5   6
      5    5   6   7
      11  11  12  13
      12  12  13  14
      13  13  14  15
      > 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-06
        • 2019-10-10
        相关资源
        最近更新 更多