gpt4 book ai didi

r - 将汇总函数转换为 dplyr 中的非标准评估 NSE

转载 作者:行者123 更新时间:2023-12-05 00:56:24 24 4
gpt4 key购买 nike

考虑以下生成汇总表的交互式示例:

library(dplyr)

tg <- ToothGrowth
ci_int <- 0.95

tg %>%
group_by(supp, dose) %>%
summarise(N = n(),
mean = mean(len, na.rm = T),
sd = sd(len, na.rm = T),
se = sd / sqrt(N),
ci = se * qt(ci_int / 2 + 0.50, N - 1))

# supp dose N mean sd se ci
# (fctr) (dbl) (int) (dbl) (dbl) (dbl) (dbl)
# 1 OJ 0.5 10 13.23 4.459709 1.4102837 3.190283
# 2 OJ 1.0 10 22.70 3.910953 1.2367520 2.797727
# 3 OJ 2.0 10 26.06 2.655058 0.8396031 1.899314
# 4 VC 0.5 10 7.98 2.746634 0.8685620 1.964824
# 5 VC 1.0 10 16.77 2.515309 0.7954104 1.799343
# 6 VC 2.0 10 26.14 4.797731 1.5171757 3.432090

我想将其转换为函数并抽象出 data.frame , measure变量, groupvars分组变量,以及 conf.int .这是一个开始:
library(lazyeval)

summarySE <- function(df, measure, groupvars, conf.int = 0.95) {
summary_dots <- list(
~ n(),
interp(~ mean(var, na.rm = T), var = as.name(measure)),
interp(~ sd(var, na.rm = T), var = as.name(measure))
)

df %>%
group_by_(.dots = groupvars) %>%
summarise_(.dots = setNames(summary_dots, c("N", "mean", "sd")))
}

summarySE(tg, "len", c("supp", "dose"))

其中产生:
#     supp  dose     N  mean       sd
# (fctr) (dbl) (int) (dbl) (dbl)
# 1 OJ 0.5 10 13.23 4.459709
# 2 OJ 1.0 10 22.70 3.910953
# 3 OJ 2.0 10 26.06 2.655058
# 4 VC 0.5 10 7.98 2.746634
# 5 VC 1.0 10 16.77 2.515309
# 6 VC 2.0 10 26.14 4.797731

不过,这感觉不是很DRY?另外,我不确定如何实现 seci没有变得过于复杂/冗长?也许有更好的方法,或者这应该分成几个功能?

如何将上面的汇总表转换为函数,以便我可以将 data.frame 的任意组合传递给它与不同 measuregroupvarsdplyr的“精神” ?

最佳答案

我不太明白为什么 SE 和 CI 的计算比您已经在做的更复杂。

我用了 ...参数来捕获您的分组参数,因为这看起来更容易使用。

总的来说,我最终得到了以下功能:

summarySE <- function(.data, measure, ..., conf.int = 0.95) {
dots <- lazyeval::lazy_dots(...)
measure <- lazyeval::lazy(measure)

summary_dots <- list(
N = ~ n(),
mean = lazyeval::interp(~ mean(var, na.rm = T), var = measure),
sd = lazyeval::interp(~ sd(var, na.rm = T), var = measure),
se = ~ sd / sqrt(N),
ci = ~ se * qt(conf.int / 2 + 0.50, N - 1))

.data <- dplyr::group_by_(.data, .dots = dots)
dplyr::summarise_(.data, .dots = summary_dots)
}

如果您愿意(以及 Hadley 可能会这样做),您可以将其制作成 SE 和 NSE 版本。

用法:
summarySE(tg, len, supp, dose)

Source: local data frame [6 x 7]
Groups: supp [?]

supp dose N mean sd se ci
(fctr) (dbl) (int) (dbl) (dbl) (dbl) (dbl)
1 OJ 0.5 10 13.23 4.459709 1.4102837 3.190283
2 OJ 1.0 10 22.70 3.910953 1.2367520 2.797727
3 OJ 2.0 10 26.06 2.655058 0.8396031 1.899314
4 VC 0.5 10 7.98 2.746634 0.8685620 1.964824
5 VC 1.0 10 16.77 2.515309 0.7954104 1.799343
6 VC 2.0 10 26.14 4.797731 1.5171757 3.432090

关于r - 将汇总函数转换为 dplyr 中的非标准评估 NSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36183092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com