R с использованием dplyr group_by / sum для l oop, вывод в виде составного списка - PullRequest
0 голосов
/ 28 апреля 2020

Я использую пакет 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

Мой вопрос: есть ли лучший способ вместо использования для l oop?

Cheers, Andi

1 Ответ

0 голосов
/ 28 апреля 2020

Мы могли бы повернуть в «длинный» формат, а затем сделать группу по «сумме»

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 

Мы также можем сделать sum, сгруппированный по «неделе» в первую очередь, и повернуть к «длинный» формат

df %>% 
   group_by(week) %>% 
   summarise_at(vars(-group_cols()), sum) %>% 
   pivot_longer(cols = starts_with('var'), names_to = 'group', values_to = 'summe')  %>% 
   select(week, summe, group)

data

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...