我一直坚持尝试做一些简单的事情:使用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$a
和df$c
中的字符串“ apple”。我想这样做,是因为我希望df$b
或df$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()
?
答案 0 :(得分:0)
您的函数不起作用,因为您试图将对象a
传递给该函数,但是该对象在您的环境中不存在。该函数正在悄悄地失败,并且没有清楚这是正在发生的,这可能是R中具有挑战性的事情之一。
使函数正常工作的一种方法是将列名作为字符传递给函数,然后在数据框中找到合适的列:
check_apple <- function(x) {
grep("apple", df[, x])
}
check_apple('a')
[1] 1 4