3

たとえば、分位数の列をデータセットに追加するための最良の方法は何でしょうか。そのためにave()関数を使用することを考えて ave(iris$Sepal.Length, iris$Species, FUN=quantile)いましたが、この場合、ave()によって返された値(この場合はサブセットごとに5つの値を返します)をマージし、 ...quantile()の長さにカットします。iris

提案を事前に感謝します!

4

2 に答える 2

4

この一般的なトピックには多くのSOの質問があり、、、、のさまざまな使用法を推奨します。またはave()、個人の好み、読みやすさ、コンパクトさ、柔軟性、速度に応じて...これがあなたが望むことをするように見える簡単な解決aggregate()plyr()です。reshape2::castdata.tableaggregate()

(aa <- aggregate(Sepal.Length~Species,data=iris,quantile))

##      Species Sepal.Length.0% Sepal.Length.25% Sepal.Length.50% Sepal.Length.75%
## 1     setosa           4.300            4.800            5.000            5.200
## 2 versicolor           4.900            5.600            5.900            6.300
## 3  virginica           4.900            6.225            6.500            6.900
##   Sepal.Length.100%
## 1             5.800
## 2             7.000
## 3             7.900

編集:再読込/コメントに基づく、これはあなたが望むものではありません:グループごとに1回だけでなく、各行に複製された要約値が必要です。

多分

merge(iris,aa,by="Species")

ただし、少し奇妙なデータフレームが表示されます(最後の「列」は実際には行列です)。

少し魔法ですが、

merge(iris,with(aa,data.frame(Species,Sepal.Length)))

aggregate()より良い-それはもう少しによって返された奇妙なデータフレームを解凍します(名前はまだ少し不安定です)。

于 2013-01-27T19:59:07.920 に答える
3

data.tableパッケージの場合:

library(data.table)
dt <- data.table(iris)
dt[, paste0("q", 25*(0:4)) := as.list(quantile(Sepal.Length)), by="Species"]
于 2013-01-27T20:20:29.547 に答える