【发布时间】:2020-07-14 17:10:21
【问题描述】:
我编写了一个函数来汇总三个数据集中的相同数值变量。当我将 x 替换为实际的变量名时,此代码在函数之外工作。
k1 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))
k2 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))
k3 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))
numeric_var_summary <- function(x) {
x <- enquo(x)
k1_x <- k1 %>%
select(year, !!x) %>%
group_by(year) %>%
summarize(min = min(!!x), Q1 = quantile(!!x, 0.25), median = median(!!x),
Q3 = quantile(!!x, 0.75), max = max(!!x), Qrange = quantile(!!x, 0.75) - quantile(!!x, 0.25),
mean = mean(!!x), sd = sd(x), n = n(),
missing = sum(is.na(!!x)))
k2_x <- k2 %>%
select(xear, !!x) %>%
group_by(year) %>%
summarize(min = min(!!x), Q1 = quantile(!!x, 0.25), median = median(!!x),
Q3 = quantile(!!x, 0.75), max = max(!!x), Qrange = quantile(!!x, 0.75) - quantile(!!x, 0.25),
mean = mean(!!x), sd = sd(!!x), n = n(),
missing = sum(is.na(!!x)))
k3_x <- k3 %>%
select(year, !!x) %>%
group_by(year) %>%
summarize(min = min(!!x), Q1 = quantile(x, 0.25),
median = median(!!x), Q3 = quantile(!!x, 0.75),
max = max(!!x), Qrange = quantile(!!x, 0.75) - quantile(!!x, 0.25),
mean = mean(!!x), sd = sd(!!x), n = n(),
missing = sum(is.na(!!x)))
return(bind_rows(k1_x, k2_x, k3_x), n = Inf)
}
numeric_var_summary(x = variable_name)
但是当我尝试运行该函数时出现此错误:
Error in is.data.frame(x) :
'pairlist' object cannot be coerced to type 'double'
我想知道这是否是整洁评估的问题?不确定我是否正确地这样做了。感谢您的帮助。
【问题讨论】:
-
如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。定义变量
k1、k2等,这样我们就可以实际运行代码了。 -
现在当我运行你提供的代码时,我没有得到同样的错误。我得到“不能对不存在的列进行子集化。x 列
year不存在。”。您正在使用x=variable_name调用该函数,但这不是您的k1数据中的列名。请确保您的示例是可重现的。 -
示例现在应该可以重现了。
-
我仍然得到一个不同的错误。我得到“
summarise()输入sd的问题。不能强制 x '语言'对象键入'double'”这可能是因为您在创建k1_x时使用了sd(x)而不是sd(!!x)。似乎还有一个quantile(x, 0.25)缺少!!以及“xear”而不是“year”的拼写错误。请仔细检查您的代码。 -
现在可以使用了。就像你说的那样,有一些失踪的
!!。非常感谢。