Rのさまざまな列に異なる集約関数を適用する方法を教えてください。

StackOverflow https://stackoverflow.com//questions/10702708

  •  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")))
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top