使用mtcars
数据框,如何获得包含字符串“ 3”的新数据框
到目前为止,我有:
mtcars<-lapply(mtcars, function(x) as.character(x))
myindices<-sapply(mtcars, function(x) { grep("3",x, ignore.case = TRUE) })
这给了我索引列表。我该如何从原始数据中获取经过过滤的数据框。
请随时批评我的方法,这是我真正感兴趣的最终结果
答案 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
中的Reduce
与base 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