【问题标题】:grep on multiple variables rgrep 对多个变量 r
【发布时间】:2019-05-22 19:43:37
【问题描述】:

我一直在尝试做一些应该很简单的事情:使用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$b 中所有带有“apple”的行在df$adf$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()

【问题讨论】:

标签: r function


【解决方案1】:

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

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

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


check_apple('a')
[1] 1 4

【讨论】:

  • 谢谢。这行得通。我应该看到的。我会尽快接受这个答案。
猜你喜欢
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多