如何过滤数据帧中任何列中包含字符串的行

时间:2019-07-08 18:12:48

标签: r

使用mtcars数据框,如何获得包含字符串“ 3”的新数据框

到目前为止,我有:

mtcars<-lapply(mtcars, function(x) as.character(x))
myindices<-sapply(mtcars, function(x) { grep("3",x, ignore.case = TRUE) })

这给了我索引列表。我该如何从原始数据中获取经过过滤的数据框。

请随时批评我的方法,这是我真正感兴趣的最终结果

5 个答案:

答案 0 :(得分:3)

我们可以使用filter_all中的dplyr。这将返回一个包含行的数据帧,该行至少具有包含字符串“ 3”的一列:

library(dplyr)

mtcars %>%
  filter_all(any_vars(grepl("3", .)))

如果我们想要一个包含行的数据框,该行的 all 列包含字符串“ 3”。我们使用all_vars代替any_vars

mtcars %>%
  filter_all(all_vars(grepl("3", .)))

答案 1 :(得分:3)

我们可以将grepl中的Reducebase R一起使用

out <- mtcars[Reduce(`|`, lapply(mtcars, grepl, pattern = "3")),]
dim(out)
#[1] 31 11

答案 2 :(得分:3)

类似于您的sapply解决方案:

mtcars[sapply(1:nrow(mtcars), function(i) any(grepl("3", mtcars[i,], fixed = T))),]

或者,您也可以这样做:

mtcars[grepl("3", do.call(paste0, mtcars), fixed = T),]

答案 3 :(得分:0)

另一种基础R解决方案:

mtcars[apply(mtcars,1,function(x) grepl("3",paste(x,collapse=""))),]

答案 4 :(得分:0)

我们可以使用toString

mtcars.3 <- mtcars[grep("3", apply(mtcars, 1, toString)), ]

检查:

rbind(mtcars=dim(mtcars), mtcars.3=dim(mtcars.3))
         [,1] [,2]
mtcars     32   11
mtcars.3   31   11