web-dev-qa-db-ja.com

複数の列でグループ化し、他の複数の列を合計します

約200列のデータフレームがありますが、そのうちの最初の10程度でテーブルをグループ化し、残りの列を合計します。

グループ化するすべての列名のリストと、集計するすべての列のリストがあります。

私が探している出力形式は、同じ数のcolを持つ同じデータフレームで、グループ化されている必要があります。

パッケージを使用した解決策はありますかdata.tableplyrまたは他の何か?

18
user1042267

data.table の方法は次のとおりです。

DT[, lapply(.SD,sum), by=list(col1,col2,col3,...)]

または

DT[, lapply(.SD,sum), by=colnames(DT)[1:10]]

どこ .SDは、(D)atagroup列の(S)ubsetを除くグループ列です。 (脇:グループ列を総称的に参照する必要がある場合、それらは.BY。)

18
Matt Dowle

ベースRでは、これは...

aggregate( as.matrix(df[,11:200]), as.list(df[,1:10]), FUN = sum)

[〜#〜] edit [〜#〜]:集約関数は、私がこれを書いてから長い道のりを歩んできました。上記のキャストは必要ありません。

aggregate( df[,11:200], df[,1:10], FUN = sum )

そして、これを書く様々な方法があります。最初の10列の名前がa1 使って a10冗長ではありますが、以下が好きです。

aggregate(. ~ a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10, data = dat, FUN = sum)

(ペーストを使用して式を作成し、formulaを使用できます)

17
John

これはddplyのタスクのようです(plyrに含まれている「baseball」データセットを使用します):

library(plyr)
groupColumns = c("year","team")
dataColumns = c("hr", "rbi","sb")
res = ddply(baseball, groupColumns, function(x) colSums(x[dataColumns]))
head(res)

これにより、groupColumnsごとにdataColumnsで指定された列の合計が提供されます。

16
Paul Hiemstra

dplyrの方法は次のとおりです。

library(dplyr)
df %>%
  group_by(col1, col2, col3) %>%
  summarise_each(funs(sum))

summarise_eachのヘルプファイルに記載されている特別な関数を使用して、?dplyr::selectから要約または除外する列をさらに指定できます。

11

Plyr :: ddply:を使用する

library(plyr)
ddply(dtfr, .(name1, name2, namex), numcolwise(sum))
10
Luciano Selzer

Dplyrを使用してこれを行う一般的な方法(列のリストは不要)は、次のとおりです。

df %>% group_by_if(is.factor) %>% summarize_if(is.numeric,sum,na.rm = TRUE)
1
Michael Johnson