删除数据框中任何向量中包含字符串的行
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 他们消失了
以上是关于删除数据框中任何向量中包含字符串的行的主要内容,如果未能解决你的问题,请参考以下文章