たとえば、分位数の列をデータセットに追加するための最良の方法は何でしょうか。そのためにave()関数を使用することを考えて ave(iris$Sepal.Length, iris$Species, FUN=quantile)
いましたが、この場合、ave()
によって返された値(この場合はサブセットごとに5つの値を返します)をマージし、 ...quantile()
の長さにカットします。iris
提案を事前に感謝します!
たとえば、分位数の列をデータセットに追加するための最良の方法は何でしょうか。そのためにave()関数を使用することを考えて ave(iris$Sepal.Length, iris$Species, FUN=quantile)
いましたが、この場合、ave()
によって返された値(この場合はサブセットごとに5つの値を返します)をマージし、 ...quantile()
の長さにカットします。iris
提案を事前に感謝します!
この一般的なトピックには多くのSOの質問があり、、、、のさまざまな使用法を推奨します。またはave()
、個人の好み、読みやすさ、コンパクトさ、柔軟性、速度に応じて...これがあなたが望むことをするように見える簡単な解決aggregate()
策plyr()
です。reshape2::cast
data.table
aggregate()
(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()
より良い-それはもう少しによって返された奇妙なデータフレームを解凍します(名前はまだ少し不安定です)。
data.tableパッケージの場合:
library(data.table)
dt <- data.table(iris)
dt[, paste0("q", 25*(0:4)) := as.list(quantile(Sepal.Length)), by="Species"]