如何在dplyr summarise()中使用循环

时间:2019-09-20 12:00:52

标签: r loops dplyr variable-assignment

分组后,我需要总结一堆变量。我需要对几个变量应用不同的功能,而我需要对大约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()逐列绑定到df来循环地通过cbind()完成此任务,但这效率太低,因此只能手动创建25个变量似乎更有效:)有什么想法可以使这个过程自动化吗?

1 个答案:

答案 0 :(得分:1)

您可以将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")
           )