我正在研究一个函数,它将有关特定变量的信息与有关它来自的数据框的一些基本信息相结合。这是我正在谈论的一个例子:
fcn <- function(var,data) {
return(ncol(data)*mean(var))
}
df <- data.frame(a=1:10,b=1:10)
df %>% dplyr::mutate(c=fcn(a,df))
这工作正常!但是,如果在函数与动词一起使用with
或在dplyr
动词内部使用的情况下,我可以直接获取数据框/tibble 对象而不显式传递它,那将是非常简洁的。所以理想情况下像
fcn <- function(var,data=attached_data_object) {
return(ncol(data)*mean(var))
}
df <- data.frame(a=1:10,b=1:10)
df %>% dplyr::mutate(c=fcn(a))
我一直在阅读各种环境功能 - 似乎我应该能够进入 with/dplyr 从数据帧创建的环境,然后将整个内容全部取出。到目前为止,我一直无法弄清楚如何实现这一点。任何提示表示赞赏!谢谢你。
(如果我的条款略有错误,向哈德利道歉)。您可能会发现Advanced R 中有关环境和 NSE(非标准评估)的章节很有用。
在 dplyr 动词(例如 mutate)中,被操作的数据帧/tibble 称为“.”。因此“。” 在此处的另一个答案中引用数据框。dplyr 动词自动在“.”中查找。对于指定的列名。当您从 mutate() 中调用函数时,正如您在此处所做的那样,您希望访问名为“.”的对象。存在于函数的执行环境中。那么我们该怎么做呢?
fcn <- function(var) {
dat <- get(".", env=parent.frame())
return(ncol(dat) * mean(var))
}
notacol <- 8
df <- data.frame(a=1:10, b=seq(10, 100, 10))
df
a b
1 1 10
2 2 20
3 3 30
4 4 40
5 5 50
6 6 60
7 7 70
8 8 80
9 9 90
10 10 100
df %>% mutate(c = fcn(a), d = fcn(b), e = fcn(notacol))
a b c d e
1 1 10 11 110 16
2 2 20 11 110 16
3 3 30 11 110 16
4 4 40 11 110 16
5 5 50 11 110 16
6 6 60 11 110 16
7 7 70 11 110 16
8 8 80 11 110 16
9 9 90 11 110 16
10 10 100 11 110 16
我认为这就是你所追求的行为。请注意,notacol
在执行环境中找不到它,因为它不在数据框中,但 Global Env 位于搜索路径上,因此可以在那里找到。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句