R使用dplyr group_by / sum for循环,作为连接列表输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R使用dplyr group_by / sum for循环,作为连接列表输出相关的知识,希望对你有一定的参考价值。

我正在使用dplyr软件包对一周变量进行分组,并获得三个变量的总和。输出应相互连接。这是我的数据框df:

week var1 var2 var3
 1    1    2    3
 1    2    2    3
 2    4    4    5
 2    2    2    6
 3    6    6    6
 3    4    4    4

我的命令是

calculate <- function(vars){
   x <- df %>% group_by(week) %>% summarise(summe = sum(vars))%>%mutate(group = paste(vars))
   x
}
cols <- c("var1", "var2", "var3")
for (i in 1:length(cols)){
var <- cols[i]
    cal <- calculate(var)
    total <- rbind(total,cal)   
} 

预期输出应为

 week summe group
   1    3    var1
   2    6    var1 
   3    10   var1
   1    4    var2
   2    6    var2
   3    10   var2
   1    6    var3
   2    11   var3
   3    10   var3

我的问题是:有没有比使用for循环更好的方法了?

干杯,安迪

答案

[我们可以将其设置为'long'格式,然后按'sum'进行分组]

library(dplyr)
library(tidyr)
df %>%
    pivot_longer(cols = starts_with('var'), names_to = 'group') %>%
    group_by(week, group) %>%
    summarise(summe = sum(value)) %>%
    ungroup %>%
    arrange(group) %>%
    select(week, summe, group)
# A tibble: 9 x 3
#   week summe group
#  <int> <int> <chr>
#1     1     3 var1 
#2     2     6 var1 
#3     3    10 var1 
#4     1     4 var2 
#5     2     6 var2 
#6     3    10 var2 
#7     1     6 var3 
#8     2    11 var3 
#9     3    10 var3 

数据

df <- structure(list(week = c(1L, 1L, 2L, 2L, 3L, 3L), var1 = c(1L, 
2L, 4L, 2L, 6L, 4L), var2 = c(2L, 2L, 4L, 2L, 6L, 4L), var3 = c(3L, 
3L, 5L, 6L, 6L, 4L)), class = "data.frame", row.names = c(NA, 
-6L))

以上是关于R使用dplyr group_by / sum for循环,作为连接列表输出的主要内容,如果未能解决你的问题,请参考以下文章

R语言dplyr包使用group_by函数和summarise函数构建频率表实战

在 R 中使用 dplyr 在 group_by 之后应用自定义函数

在 dplyr 中使用 group_by 时在 R 中格式化数字 [重复]

如何使用 R 和 dplyr 中连续的元素执行 group_by

R语言dplyr包使用group_by函数arrange函数和filter函数获取每个分组的第一个第N个最后一个记录实战

R语言dplyr包获取dataframe分组聚合汇总统计值实战(group_by() and summarize() ):均值中位数分位数IQRMADcountunique