R函数在管道中使用时不起作用

mspsb9vt  于 2023-04-09  发布在  其他
关注(0)|答案(3)|浏览(267)

我创建了这个函数:

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

但是当用在管道中时它就失效了。我怎么能用在管道中呢?

mtcars %>% ddes(mpg)

# Error in ddes(., mpg) : unused argument (mpg)
vktxenjb

vktxenjb1#

%>%之后调用的函数应该在第一个位置有一个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

请参阅Programming with dplyr小插图中的更多详细信息。

ecbunoof

ecbunoof2#

应该是的

mtcars$mpg %>% ddes()

因为管道操作符将整个变量替换为ddes函数的第一个参数。

fae0ux8s

fae0ux8s3#

使用curly curly的替代方法:

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

相关问题