1

正しい用語で検索していないかどうかはわかりませんが、これに関する投稿が見つかりません。

私は df を持っています:

df <- data.frame(grouping_letter = c('A', 'A', 'B', 'B', 'C', 'C'), grouping_animal = c('Cat', 'Dog', 'Cat', 'Dog', 'Cat', 'Dog'), value = c(1,2,3,4,5,6))

grouping_letterと でグループ化したいgrouping_animal。を使用してこれを行いたいですdplyr

私が別々にやった場合、それは次のようになります:

df %>% group_by(grouping_letter) %>% summarise(sum(value))

df %>% group_by(grouping_animal) %>% summarise(sum(value))

ここで、個別にグループ化する必要がある何百もの列があるとします。これどうやってするの?

やってみた:

results <- NULL for (i in grouping_columns) { results[[i]] <- df %>% group_by(df$i) %>% summarize(sum(value)) }

結果と呼ばれるリストを出力とともに取得しました。forループを使用する代わりに、これを行うためのより良い方法があるかどうか疑問に思っていますか?

4

1 に答える 1

2

「グループ化」列のインデックスを作成し ( を使用grep)、インデックスをループ処理し( を使用)、 「インデックス」内の列でグループ化した後に「値」をlapply個別に取得できます。sum

 library(dplyr)
 i1 <- grep('grouping', names(df))
 lapply(i1, function(i) 
        df[setdiff(seq_along(df), i)] %>% 
                     group_by_(.dots=names(.)[1]) %>% 
                     summarise(Sumvalue= sum(value)))
#[[1]]
#Source: local data frame [2 x 2]

#  grouping_animal Sumvalue
#           (fctr)    (dbl)
#1             Cat        9
#2             Dog       12

#[[2]]
#Source: local data frame [3 x 2]

#  grouping_letter Sumvalue
#           (fctr)    (dbl)
#1               A        3
#2               B        7
#3               C       11

または、データセットを「ワイド」形式から「ロング」形式に変換し、関連する列でグループ化してsum「値」を取得することでこれを行うことができます。

library(tidyr)
gather(df, Var, Group, -value) %>% 
         group_by(Var, Group) %>% 
         summarise(Sumvalue = sum(value))
#              Var Group Sumvalue
#            (chr) (chr)    (dbl)
#1 grouping_animal   Cat        9
#2 grouping_animal   Dog       12
#3 grouping_letter     A        3
#4 grouping_letter     B        7
#5 grouping_letter     C       11
于 2016-02-15T16:25:05.687 に答える