我有这个数据框:
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;而且我不知道变量/列名称。
有关如何快速完成此操作的任何建议?非常感谢!
答案 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]))
然后测试了apply
,Filter
和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建议。