Rのさまざまな列に異なる集約関数を適用する方法を教えてください。
-
13-12-2019 - |
質問
Rのさまざまな列に異なる集約関数を適用する方法は?aggregate()
関数は、渡す1つの関数引数のみを提供します。
V1 V2 V3
1 18.45022 62.24411694
2 90.34637 20.86505214
1 50.77358 27.30074987
2 52.95872 30.26189013
1 61.36935 26.90993530
2 49.31730 70.60387016
1 43.64142 87.64433517
2 36.19730 83.47232907
1 91.51753 0.03056485
... ... ...
> aggregate(sample,by=sample["V1"],FUN=sum)
V1 V1 V2 V3
1 1 10 578.5299 489.5307
2 2 20 575.2294 527.2222
.
各列に異なる関数を適用する方法、すなわちV2
関数を使用してmean()
関数とV2
関数を使用してsum()
を複数回呼び出すことなくaggregate()
関数を集約しますか?
解決
そのタスクの場合、ddply
plyr
を使用します。
> library(plyr)
> ddply(sample, .(V1), summarize, V2 = sum(V2), V3 = mean(V3))
V1 V2 V3
1 1 578.5299 48.95307
2 2 575.2294 52.72222
. 他のヒント
...または同じ名前のパッケージ内の関数data.table
:
library(data.table)
myDT <- data.table(sample) # As mdsumner suggested, this is not a great name
myDT[, list(sumV2 = sum(V2), meanV3 = mean(V3)), by = V1]
# V1 sumV2 meanV3
# [1,] 1 578.5299 48.95307
# [2,] 2 575.2294 52.72222
. 既に撮影されているx
ではなくDataFrame sample
を呼び出しましょう。
編集:
by
関数は、分割/適用/コンバイン
by(x, list(x$V1), f)
.
:編集
lapply(split(x, x$V1), myfunkyfunctionthatdoesadifferentthingforeachcolumn)
.
もちろん、それは各列の個別の機能ではなく、両方のジョブを実行できます。
myfunkyfunctionthatdoesadifferentthingforeachcolumn = function(x) c(sum(x$V2), mean(x$V3))
.
結果を照合する便利な方法はこのようなものです(しかし包括的な解決策のためにPlyrパッケージをチェックし、この動機をよりよく学ぶことを考慮してください)。
matrix(unlist(lapply(split(x, x$V1), myfunkyfunctionthatdoesadifferentthingforeachcolumn)), ncol = 2, byrow = TRUE, dimnames = list(unique(x$V1), c("sum", "mean")))
. 所属していません StackOverflow