我创建了这个函数:
library(tibble); library(dplyr); library(magrittr)
ddes <- function(variable) {
n = length(variable)
median = median(variable)
mean = mean(variable)
sd = sd(variable)
se = round(sqrt(var(variable) / length(variable)), 2)
lower.95 = mean(variable) - (abs(qt(0.025, df = n - 1)) * se)
upper.95 = mean(variable) + (abs(qt(0.025, df = n - 1)) * se)
tibble(n, median, mean, sd, se, lower.95, upper.95)
}
它自己可以正常工作:
ddes(mtcars$mpg)
# # A tibble: 1 × 7
# n median mean sd se lower.95 upper.95
# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 32 19.2 20.1 6.03 1.07 17.9 22.3
但是在pipe中使用时失败。我如何使用管道?
mtcars %>% ddes(mpg)
# Error in ddes(., mpg) : unused argument (mpg)
在%>%
之后调用的函数应该在第一个位置有一个data
参数(或另一个名称),这就是为什么您在错误消息中看到ddes(., mpg)
。您可以这样重写函数:
library(tibble)
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
ddes <- function(data, variable) {
mydata <- pull(data, {{ variable }})
n = length(mydata)
median = median(mydata)
mean = mean(mydata)
sd = sd(mydata)
se = round(sqrt(var(mydata) / length(mydata)), 2)
lower.95 = mean(mydata) - (abs(qt(0.025, df = n - 1)) * se)
upper.95 = mean(mydata) + (abs(qt(0.025, df = n - 1)) * se)
tibble(n, median, mean, sd, se, lower.95, upper.95)
}
mtcars %>% ddes(mpg)
#> # A tibble: 1 × 7
#> n median mean sd se lower.95 upper.95
#> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 32 19.2 20.1 6.03 1.07 17.9 22.3
参见dplyr
编程插图中的更多细节。
应该是
mtcars$mpg %>% ddes()
,因为管道操作符将整个变量替换为ddes
函数的第一个参数。
另一种方法是使用大括号:
library(dplyr)
ddes <- function(df, varname) {
df %>%
summarize(
n = n(),
median = median({{varname}}),
mean = mean({{varname}}),
sd = sd({{varname}}),
se = round(sd / sqrt(n), 2),
lower.95 = mean - (abs(qt(0.025, df = n - 1)) * se),
upper.95 = mean + (abs(qt(0.025, df = n - 1)) * se)
)
}
mtcars %>%
ddes(mpg)
n median mean sd se lower.95 upper.95
1 32 19.2 20.09062 6.026948 1.07 17.90835 22.2729