【问题标题】:Remove rows containing string in any vector in data frame删除数据框中任何向量中包含字符串的行
【发布时间】:2016-08-07 08:19:53
【问题描述】:

我有一个数据框,其中包含许多包含字符串的向量我想删除包含某个字符串的行。

df <- data.frame(id=seq(1:10),
             foo=runif(10),
             sapply(letters[1:5],function(x) {sample(letters,10,T)} ),
             bar=runif(10))

这可以通过指定向量名称来在单个向量上完成,即

df <- df[!grepl("b", df$a),]

然后我可以重复指定每个向量,例如

df <- df[!grepl("b", df$b),]
df <- df[!grepl("b", df$c),]
df <- df[!grepl("b", df$d),]
df <- df[!grepl("b", df$e),]

但是是否可以在一行中完成,而不必指定哪些列包含字符串?比如:

df <- df[!grepl("b", df),]

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以试试

    df[-which(df=="b", arr.ind=TRUE)[,1],]
    

    或者,正如@docendodiscimus 所建议的那样

    df[rowSums(df == "b") == 0,]
    

    第二个选项更可取,因为如果找不到匹配的模式,它不会导致任何困难。

    【讨论】:

    • 我发现否定索引是一种有点危险的方法,因为当没有匹配时它会返回一个空的 data.frame。例如df[-which(df=="ab", arr.ind=TRUE)[,1],]。这也是为什么我更喜欢grepl 而不是grep
    • 我同意。你的建议更好。
    • 请随时将其添加到您的答案中
    • 谢谢你,@docendodiscimus
    【解决方案2】:

    粘贴列然后grepl:

    df[!grepl("b", paste0(df$a, df$b, df$c, df$d, df$e)), ]
    

    识别因子(或字符列)然后粘贴:

    df[!grepl("b", 
              apply(df[, sapply(df, class) == "factor"], 1, paste0, collapse = ",")), ]
    

    【讨论】:

    • 感谢您的回答 - 但理想情况下,我不必在任何地方指定列,因为实际上我可能有很多列
    【解决方案3】:
    target_cols <- c("a", "b", "c", "d", "e")
    df[!Reduce(`|`, lapply(df[,target_cols], function(col) grepl("b", col))),]
    

    【讨论】:

    • 谢谢 - 但就像我上面的评论一样 - 理想情况下,我不必指定哪些列包含字符串,因为实际上可能会有很多
    • 我想展示更灵活的解决方案,但如果不指定列,它会更简单df[!Reduce(|, lapply(df, function(col) grepl("b", col))),]| 周围必须有反引号,就像答案一样,但在 cmets 他们消失了
    猜你喜欢
    • 2019-12-02
    • 2018-02-25
    • 2021-10-13
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2018-01-21
    相关资源
    最近更新 更多