如何在 dplyr summarise() 中使用循环
how to use loop inside dplyr summarise()
我需要在分组后对一堆变量进行汇总。我需要对几个变量应用不同的函数,并且我需要对大约 25 个变量应用相同的函数。在我看来,它应该以某种方式进行优化,这样我就不需要手动编写 25 次新变量的名称以及为了获取它应该完成的操作。
我已经通过 dplyr 包尝试了两个选项,但是它们并不成功。进一步介绍了我对玩具示例的尝试:
library('dplyr')
df <- data.frame(letter = c('A', 'A', 'B', 'C', 'A', 'B'),
group = c('group1', 'group1', 'group2', 'group3', 'group1', 'group2'),
var1= c(1,2,3,4,5,6),
var2=c(6,6,6,6,6,6),
var3=c(2,2,2,2,2,2),
var4=c(5,5,5,5,5,5))
var_names <-c('var2', 'var3', 'var4')
groupped <-df%>%
group_by(letter, group)%>%
summarise(var1_mean = mean(var1),
freq = n(),
for (varp in var_names) {
nam <- paste(varp, "_sum", sep = "")
assign(nam, eval(parse(text=paste0("sum(", varp,")"))))
}
)
我收到错误,assign()
不适用于 dplyr,所以我尝试了这些:
groupped <- df%>%
group_by(letter, group)%>%
summarise(var1_mean = mean(var1),
freq=n(),
for(i in vars){
nam <- paste0("sum", i)
!!sym(nam) := sum(i)
})
我知道如何通过 arrange()
在循环中通过 cbind()
逐列绑定到 df 来完成此任务,但这太低效了,所以只创建 25手动变量似乎更有效:) 有什么想法可以使这个过程自动化吗?
您可以使用 summarise_at
来达到这个目的:
df %>% summarise_at(vars(var_names), list(mean = mean, sum = sum))
如果还有一些您不想应用到所有列的函数,您需要单独应用,left_join
结果:
df %>%
group_by(letter, group) %>%
summarise(freq = n()) %>%
left_join(df %>%
group_by(letter, group)%>%
summarise_at(vars(var_names), list(mean = mean, sum = sum)),
by = c("letter", "group")
)
我需要在分组后对一堆变量进行汇总。我需要对几个变量应用不同的函数,并且我需要对大约 25 个变量应用相同的函数。在我看来,它应该以某种方式进行优化,这样我就不需要手动编写 25 次新变量的名称以及为了获取它应该完成的操作。
我已经通过 dplyr 包尝试了两个选项,但是它们并不成功。进一步介绍了我对玩具示例的尝试:
library('dplyr')
df <- data.frame(letter = c('A', 'A', 'B', 'C', 'A', 'B'),
group = c('group1', 'group1', 'group2', 'group3', 'group1', 'group2'),
var1= c(1,2,3,4,5,6),
var2=c(6,6,6,6,6,6),
var3=c(2,2,2,2,2,2),
var4=c(5,5,5,5,5,5))
var_names <-c('var2', 'var3', 'var4')
groupped <-df%>%
group_by(letter, group)%>%
summarise(var1_mean = mean(var1),
freq = n(),
for (varp in var_names) {
nam <- paste(varp, "_sum", sep = "")
assign(nam, eval(parse(text=paste0("sum(", varp,")"))))
}
)
我收到错误,assign()
不适用于 dplyr,所以我尝试了这些:
groupped <- df%>%
group_by(letter, group)%>%
summarise(var1_mean = mean(var1),
freq=n(),
for(i in vars){
nam <- paste0("sum", i)
!!sym(nam) := sum(i)
})
我知道如何通过 arrange()
在循环中通过 cbind()
逐列绑定到 df 来完成此任务,但这太低效了,所以只创建 25手动变量似乎更有效:) 有什么想法可以使这个过程自动化吗?
您可以使用 summarise_at
来达到这个目的:
df %>% summarise_at(vars(var_names), list(mean = mean, sum = sum))
如果还有一些您不想应用到所有列的函数,您需要单独应用,left_join
结果:
df %>%
group_by(letter, group) %>%
summarise(freq = n()) %>%
left_join(df %>%
group_by(letter, group)%>%
summarise_at(vars(var_names), list(mean = mean, sum = sum)),
by = c("letter", "group")
)