在这一点上,我的回答并没有增加太多,但是当我发布评论时我正在手机上,所以我不愿意发布实际的答案。
无论如何,这就是我的建议。这与@zero323 的答案几乎相同的概念,但使用sapply 或vapply 而不是apply,因为这些可能在data.frame 的列上更有效:
mydf[vapply(mydf, function(x) any(grepl("AB", x)), vector(length = 1))]
或
mydf[sapply(mydf, function(x) any(grepl("AB", x)))]
为了显示速度差异,让我们在更大的data.frame 上尝试一下,这个是 500 行 x 500 列。
library(microbenchmark)
fun1a <- function() mydf[vapply(mydf, function(x) any(grepl("AB", x)), vector(length = 1))]
fun1b <- function() mydf[sapply(mydf, function(x) any(grepl("AB", x)))]
fun2 <- function() mydf[, apply(mydf, 2, function (x) any(grepl('AB', x)))]
set.seed(1)
nrow <- 500
ncol <- 500
x <- sample(8, nrow*ncol, replace = TRUE)
y <- lapply(x, function(z) paste(sample(LETTERS, z, replace = TRUE), collapse = ""))
mydf <- data.frame(matrix(unlist(y, use.names = FALSE), nrow = nrow))
microbenchmark(fun1a(), fun1b(), fun2(), times = 10)
# Unit: milliseconds
# expr min lq median uq max neval
# fun1a() 75.46204 82.84732 101.22437 115.8292 120.5349 10
# fun1b() 75.92004 85.82025 99.31647 108.5303 310.0216 10
# fun2() 134.82356 168.44435 182.88842 196.4751 207.9986 10
identical(fun1a(), fun2())
# [1] TRUE
identical(fun1b(), fun2())
# [1] TRUE
vapply 通常会稍微提高速度,但在这种情况下,似乎没有。