如何解决使用 dplyr、group_by、summary 进行 for 循环,并将每个变量的输出保存在列表中
我想制作一个将输出保存在列表中的函数。我关心的是如何使用 dplyr group_by 和摘要指定哪一列。想象一个大数据集。请参阅下面的进一步评论。
n <- colnames(df)[2:3]
df %>%
group_by(trt) %>%
summarise(mean.mpg = mean(n[i],na.rm = TRUE),sd.mpg = sd(n[i],n.mpg = n())%>%
mutate(se.mpg = sd.mpg / sqrt(n.mpg),lower.ci.mpg = mean.mpg - qt(1 - (0.05 / 2),n.mpg - 1) * se.mpg,upper.ci.mpg = mean.mpg + qt(1 - (0.05 / 2),n.mpg - 1) * se.mpg)
为什么 n[i] 不起作用?应该如何指定 this 才能在函数中使用它?
list_Data <- list()
for (i in 2:ncol(df)){
list_Data[[i]]<- df %>%
group_by(trt) %>%
summarise(mean.mpg = mean(n[i],n.mpg = n())%>%
mutate(se.mpg = sd.mpg / sqrt(n.mpg),n.mpg - 1) * se.mpg)
}
最后我想进行这个循环并将输出保存在列表中
[[1]]
# A tibble: 3 x 7
trt mean.mpg sd.mpg n.mpg se.mpg lower.ci.mpg upper.ci.mpg
<chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 A 35.7 32.9 3 19.0 -46.0 117.
2 B 46 37.2 3 21.5 -46.5 139.
3 C 64.3 47.8 3 27.6 -54.4 183.
[[2]]
# A tibble: 3 x 7
trt mean.mpg sd.mpg n.mpg se.mpg lower.ci.mpg upper.ci.mpg
<chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 A 57.7 40.5 3 23.4 -42.8 158.
2 B 49.3 31.0 3 17.9 -27.7 126.
3 C 32.7 34.8 3 20.1 -53.8 119.
想要的输出:
size_t len = sizeof(saved_networks)/sizeof(*saved_networks);
char *saved_networks = readFile123(SPIFFS,"/wifi.txt",saved_networks,&len);
解决方法
您必须使用 sym
包中的 rlang
函数,然后使用名为 bang bang 运算符的 !!
取消引用它。在这里,因为您提供一个字符串作为列名,您需要首先将其转换为一个符号,该符号实际上指向您的数据集中的一个对象,然后您必须告诉 R 在您的数据集的上下文中对其进行评估使用 !!
运算符强制求值。您可以通过 tidyverse here 了解编程的基础知识。
library(rlang)
n <- colnames(df)[2:3]
list_Data <- vector("list",length = ncol(df) - 1)
for (i in 1:(ncol(df)-1)){
list_Data[[i]] <- df %>%
group_by(trt) %>%
summarise(mean.mpg = mean(!!sym(n[i]),na.rm = TRUE),sd.mpg = sd(!!sym(n[i]),n.mpg = n()) %>%
mutate(se.mpg = sd.mpg / sqrt(n.mpg),lower.ci.mpg = mean.mpg - qt(1 - (0.05 / 2),n.mpg - 1) * se.mpg,upper.ci.mpg = mean.mpg + qt(1 - (0.05 / 2),n.mpg - 1) * se.mpg)
}
> list_Data
[[1]]
# A tibble: 3 x 7
trt mean.mpg sd.mpg n.mpg se.mpg lower.ci.mpg upper.ci.mpg
<chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 A 62.7 30.6 3 17.7 -13.4 139.
2 B 36.7 14.0 3 8.09 1.86 71.5
3 C 17.7 16.5 3 9.53 -23.3 58.7
[[2]]
# A tibble: 3 x 7
trt mean.mpg sd.mpg n.mpg se.mpg lower.ci.mpg upper.ci.mpg
<chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 A 49 38.0 3 21.9 -45.4 143.
2 B 36 21.7 3 12.5 -17.8 89.8
3 C 30 26.9 3 15.5 -36.8 96.8
,
一种选择是索引 .data
代词,当列名存储为字符串时可以这样做:
for (i in 1:length(n)){ # <-- Note the change from 2:ncol(df)
list_Data[[i]]<- df %>%
group_by(trt) %>%
summarise(mean.mpg = mean(.data[[n[i]]],# <-- .data pronoun here
sd.mpg = sd(.data[[n[i]]],# and here
n.mpg = n())%>%
mutate(se.mpg = sd.mpg / sqrt(n.mpg),n.mpg - 1) * se.mpg)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。