删除数据框中任何向量中包含字符串的行

Posted

技术标签:

【中文标题】删除数据框中任何向量中包含字符串的行【英文标题】: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),]

【问题讨论】:

【参考方案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 他们消失了

以上是关于删除数据框中任何向量中包含字符串的行的主要内容,如果未能解决你的问题,请参考以下文章

查找数据框中包含字符串向量中的一个元素的行的索引

从 pandas 数据框中删除具有空列表的行

熊猫删除任何字符串的行

保留数据框中的行,对于某些列的值的所有组合,在另一列中包含相同的元素

如何从数据数组中删除对象(核心数据)

删除熊猫中多列中包含一段字符串的所有行