如何选择包含某些字符串/字符的特定列?

时间:2015-04-25 12:47:58

标签: r dataframe dplyr

我有这个数据框:

df1 <- data.frame(a = c("correct", "wrong", "wrong", "correct"),
  b = c(1, 2, 3, 4),
  c = c("wrong", "wrong", "wrong", "wrong"),
  d = c(2, 2, 3, 4))

a       b c     d
correct 1 wrong 2
wrong   2 wrong 2
wrong   3 wrong 3
correct 4 wrong 4

并且只想选择包含字符串&#39;正确&#39;的列。或者&#39;错误&#39; (即df1中的列b和d),这样我得到了这个数据帧:

df2 <- data.frame(a = c("correct", "wrong", "wrong", "correct"),
        c = c("wrong", "wrong", "wrong", "wrong"))

        a     c
1 correct wrong
2   wrong wrong
3   wrong wrong
4 correct wrong

我可以使用dplyr执行此操作吗?如果没有,我可以使用哪些功能来执行此操作?我给出的例子很简单,因为我可以这样做(dplyr):

select(df1, a, c)

但是,在我的实际数据框架中,我有大约700个变量/列和几百列包含字符串&#39;正确&#39;或者&#39;错误&#39;而且我不知道变量/列名称。

有关如何快速完成此操作的任何建议?非常感谢!

2 个答案:

答案 0 :(得分:9)

您可以使用基本R Filter,它将对df1个列中的每一列进行操作,并使所有列满足逻辑测试:

Filter(function(u) any(c('wrong','correct') %in% u), df1)
#        a     c
#1 correct wrong
#2   wrong wrong
#3   wrong wrong
#4 correct wrong

您还可以使用grepl

Filter(function(u) any(grepl('wrong|correct',u)), df1)

答案 1 :(得分:2)

----更新----- 谢谢Beavel上校。多么优雅的解决方案。我将更多地使用Filter

我想检查速度解决方案,以防万一时间是一个重要因素:

locator <- apply(df1, 2, function(x) grepl("correct|wrong", x))
index <- apply(locator, 2, any)
newdf <- df1[,!index]

我将您的数据框扩展到500,000列:

dftest <- as.data.frame(replicate(500000, df1[,1]))

然后测试了applyFilter和grepl的函数的系统时间,Filter的模式%%in%:

f <- function() {
locator <- apply(dftest, 2, function(x) grepl("correct|wrong", x))
index <- apply(locator, 2, any)
newdf <- dftest[,!index]
}

f1 <- function() {newdf <- (Filter(function(x) any(c("wrong", "correct") %in% x), dftest))}

f2 <- function() {newdf <- Filter(function(u) any(grepl('wrong|correct',u)), dftest)}


system.time(f())
   user  system elapsed 
   24.32    0.00   24.35 
system.time(f1())
   user  system elapsed 
   2.31    0.00    2.34 
system.time(f2())
   user  system elapsed 
   8.66    0.01    8.71 

上校的解决方案是迄今为止最好的解决方案。它干净,性能最佳。 --credit @akrun for data.frame建议。