如何解决如何编写自定义管道友好函数?
我正在尝试使用 magrittr
library(magrittr)
custom_function <-
function(.data,x) {
mean(.data$x)
}
mtcars %>%
custom_function(mpg)
但我收到此错误:
Error in (function(x,i,exact) if (is.matrix(i)) as.matrix(x)[[i]] else .subset2(x,:
object 'mpg' not found
也许我对变量的引用不起作用。我该如何解决这个 .data$x
问题?
解决方法
.data$x
不是指名称保存在变量 x
中的列,而是指名为 "x"
的列。使用 .data[[x]]
引用名称为变量 x
中的字符串的列,并使用字符串 "mpg"
调用您的函数。
library(magrittr)
custom_function <- function(.data,x) mean(.data[[x]])
mtcars %>% custom_function("mpg")
## [1] 20.09062
,
在 base R
中,我们可以将 $
更改为 [[
,并使用 character
将未加引号的列名称转换为 deparse/substitute
custom_function <- function(.data,x) {
mean(.data[[deparse(substitute(x))]])
}
现在,我们应用函数
mtcars %>%
custom_function(mpg)
#[1] 20.09062
$
的问题在于,它实际上是在检查列名“x”,而不是它存储的关联值。因此,它失败并返回 NULL
使用 tidyverse
,我们可以使用卷曲运算符 ({{}}
) 在 summarise
内进行计算。由于我们只需要一个汇总输出,summarise
可以返回该单个值,而如果我们需要在原始数据集中创建一个新列,我们需要 mutate
。在我们创建汇总列后,只需将该列 pull
作为 vector
custom_function <- function(.data,x) {
.data %>%
summarise(out = mean({{x}})) %>%
pull(out)
}
mtcars %>%
custom_function(mpg)
[1] 20.09062
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。