grep在多个变量上

时间:2019-05-22 19:43:37

标签: r function grep

我一直坚持尝试做一些简单的事情:使用grep()测试字符串中模式匹配的单个数据帧中的多个变量。所有对此的搜索使我获得如何在多种模式上grep()的说明。

创建数据:

df <- data.frame(a = c("apple", "plum", "pair", "apple"), 
                 b = c(1, 2, 3, 4), 
                 c = c("plum", "apple", "grape", "orange"))
df
      a b      c
1 apple 1   plum
2  plum 2  apple
3  pair 3  grape
4 apple 4 orange

现在,我要检查df$adf$c中的字符串“ apple”。我想这样做,是因为我希望df$bdf$a中所有带有“ apple”的行都来自df$c中的值。

我希望创建一个函数:f(x)::grep("apple", df$x),并使用lapply在要检查模式的变量名称列表上对其进行测试:

check_apple <- function(x) {
   grep("apple", df$x)
}

但这不起作用:

check_apple(a)
integer(0)

但这确实可行:

grep("apple", df$a)
[1] 1 4

该功能为什么不起作用?我不能在函数中使用变量名作为参数吗?

我的计划是将函数应用于所有变量,然后在选择unique()值之前,将结果列表折叠为单个向量,以获取数据框中所有变量与字符串匹配的行。不用说,我的数据集比这个例子大得多。

我可以修复该功能,还是有另一种方法可以对多个变量运行grep()

1 个答案:

答案 0 :(得分:0)

您的函数不起作用,因为您试图将对象a传递给该函数,但是该对象在您的环境中不存在。该函数正在悄悄地失败,并且没有清楚这是正在发生的,这可能是R中具有挑战性的事情之一。

使函数正常工作的一种方法是将列名作为字符传递给函数,然后在数据框中找到合适的列:

check_apple <- function(x) {
 grep("apple", df[, x])
}


check_apple('a')
[1] 1 4