函数在 tibble 中找不到列名
Function can't find column name in tibble
我正在尝试创建一个使用 dplyr 语法来操作数据的函数,但该函数找不到列名。
# example code below
library(dplyr)
# create sample data
ex.dat = data.frame(ex.IV = c(rep(1,50),
rep(2,50)),
ex.DV = c(rnorm(n = 50, mean = 100, sd = 15),
rnorm(n = 50, mean = 115, sd = 15)))
# create simple function that finds mean and sd from sample data
ex.func = function(data,predictor,predicted){
as.tibble(data) %>%
group_by(predictor) %>%
summarise(
M = mean(predicted),
SD = sd(predicted)
)
}
# run function with sample data
ex.func(data = ex.dat, predictor = ex.IV, predicted = ex.DV)
这会产生以下错误:“错误:必须按在 .data
中找到的变量分组。未找到列 predictor
。”
我不明白为什么函数没有将 ex.IV
分配给 predictor
。
运行同样的代码,不涉及函数,当然没有问题,例如
as.tibble(ex.dat) %>%
group_by(ex.IV) %>%
summarise(
M = mean(ex.DV),
SD = sd(ex.DV))
产生了预期的结果,所以问题一定出在函数格式上。
解决方法如:
ex.func(data = ex.dat, predictor = ex.dat$ex.IV, predicted = ex.dat$ex.DV)
ex.func(data = ex.dat, predictor = data$ex.IV, predicted = data$ex.DV)
收到相同的错误。
显然我不理解 function()
的一些基本操作。我会很感激一些指示。
我们可以使用 curly-curly ({{}}
) 运算符,因为输入参数不带引号
ex.func <- function(data, predictor, predicted){
as.tibble(data) %>%
group_by({{predictor}}) %>%
summarise(
M = mean({{predicted}}),
SD = sd({{predicted}})
)
}
现在运行为
ex.func(data = ex.dat, predictor = ex.IV, predicted = ex.DV)
如果我们需要灵活的选项是传递的参数可以被引用或不被引用,那么我们可能需要使用 ensym
转换为符号并评估 (!!
ex.func <- function(data, predictor, predicted){
predictor <- rlang::ensym(predictor)
predicted <- rlang::ensym(predicted)
as.tibble(data) %>%
group_by(!!predictor) %>%
summarise(
M = mean(!!predicted),
SD = sd(!!predicted)
)
}
然后,我们可以将两者都称为
ex.func(data = ex.dat, predictor = ex.IV, predicted = ex.DV)
或
ex.func(data = ex.dat, predictor = "ex.IV", predicted = "ex.DV")
我正在尝试创建一个使用 dplyr 语法来操作数据的函数,但该函数找不到列名。
# example code below
library(dplyr)
# create sample data
ex.dat = data.frame(ex.IV = c(rep(1,50),
rep(2,50)),
ex.DV = c(rnorm(n = 50, mean = 100, sd = 15),
rnorm(n = 50, mean = 115, sd = 15)))
# create simple function that finds mean and sd from sample data
ex.func = function(data,predictor,predicted){
as.tibble(data) %>%
group_by(predictor) %>%
summarise(
M = mean(predicted),
SD = sd(predicted)
)
}
# run function with sample data
ex.func(data = ex.dat, predictor = ex.IV, predicted = ex.DV)
这会产生以下错误:“错误:必须按在 .data
中找到的变量分组。未找到列 predictor
。”
我不明白为什么函数没有将 ex.IV
分配给 predictor
。
运行同样的代码,不涉及函数,当然没有问题,例如
as.tibble(ex.dat) %>%
group_by(ex.IV) %>%
summarise(
M = mean(ex.DV),
SD = sd(ex.DV))
产生了预期的结果,所以问题一定出在函数格式上。
解决方法如:
ex.func(data = ex.dat, predictor = ex.dat$ex.IV, predicted = ex.dat$ex.DV)
ex.func(data = ex.dat, predictor = data$ex.IV, predicted = data$ex.DV)
收到相同的错误。
显然我不理解 function()
的一些基本操作。我会很感激一些指示。
我们可以使用 curly-curly ({{}}
) 运算符,因为输入参数不带引号
ex.func <- function(data, predictor, predicted){
as.tibble(data) %>%
group_by({{predictor}}) %>%
summarise(
M = mean({{predicted}}),
SD = sd({{predicted}})
)
}
现在运行为
ex.func(data = ex.dat, predictor = ex.IV, predicted = ex.DV)
如果我们需要灵活的选项是传递的参数可以被引用或不被引用,那么我们可能需要使用 ensym
转换为符号并评估 (!!
ex.func <- function(data, predictor, predicted){
predictor <- rlang::ensym(predictor)
predicted <- rlang::ensym(predicted)
as.tibble(data) %>%
group_by(!!predictor) %>%
summarise(
M = mean(!!predicted),
SD = sd(!!predicted)
)
}
然后,我们可以将两者都称为
ex.func(data = ex.dat, predictor = ex.IV, predicted = ex.DV)
或
ex.func(data = ex.dat, predictor = "ex.IV", predicted = "ex.DV")