約200列のデータフレームがありますが、そのうちの最初の10程度でテーブルをグループ化し、残りの列を合計します。
グループ化するすべての列名のリストと、集計するすべての列のリストがあります。
私が探している出力形式は、同じ数のcolを持つ同じデータフレームで、グループ化されている必要があります。
パッケージを使用した解決策はありますかdata.table
、plyr
または他の何か?
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
。)
ベース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
を使用できます)
これは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で指定された列の合計が提供されます。
dplyr
の方法は次のとおりです。
library(dplyr)
df %>%
group_by(col1, col2, col3) %>%
summarise_each(funs(sum))
summarise_each
のヘルプファイルに記載されている特別な関数を使用して、?dplyr::select
から要約または除外する列をさらに指定できます。
Plyr :: ddply:を使用する
library(plyr)
ddply(dtfr, .(name1, name2, namex), numcolwise(sum))
Dplyrを使用してこれを行う一般的な方法(列のリストは不要)は、次のとおりです。
df %>% group_by_if(is.factor) %>% summarize_if(is.numeric,sum,na.rm = TRUE)