我被困在尝试做一些应该很简单的事情: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
字符串“苹果”。我想这样做是因为我希望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
为什么这个功能不起作用?我不能在我的函数中使用 aa 变量名作为参数吗?
我的计划是将该函数应用于所有变量,然后在选择unique()
值以获取数据框中具有字符串匹配的变量的所有行之前,将结果列表折叠为单个向量。不用说,我的数据集比这个例子大得多。
我可以修复这个函数,还是有另一种方法来运行grep()
多个变量?
您的函数不起作用,因为您试图将一个对象传递a
给该函数,但该对象在您的环境中不存在。该函数正在悄悄地失败,并且没有明确表示正在发生这种情况,这可能是 R 中具有挑战性的事情之一。
使函数工作的一种方法是将列的名称作为字符传递给函数,然后在数据框中找到正确的列:
check_apple <- function(x) {
grep("apple", df[, x])
}
check_apple('a')
[1] 1 4
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句