これは、を使用したソリューションですdata.table
(特に要求されていませんが、またはの代わりに使用することは明らかaggregate
ですddply
。コーディングに少し時間がかかるだけでなく、繰り返し呼び出すquantile
と非効率になります。呼び出しごとにデータを並べ替えます。
library(data.table)
Tukeys_five <- c("Min","Q1","Med","Q3","Max")
IRIS <- data.table(iris)
# this will create the wide data.table
lengthBySpecies <- IRIS[,as.list(fivenum(Sepal.Length)), by = Species]
# and you can rename the columns from V1, ..., V5 to something nicer
setnames(lengthBySpecies, paste0('V',1:5), Tukeys_five)
lengthBySpecies
Species Min Q1 Med Q3 Max
1: setosa 4.3 4.8 5.0 5.2 5.8
2: versicolor 4.9 5.6 5.9 6.3 7.0
3: virginica 4.9 6.2 6.5 6.9 7.9
quantile
または、適切なprob
引数を使用するための単一の呼び出しを使用します。
IRIS[,as.list(quantile(Sepal.Length, prob = seq(0,1, by = 0.25))), by = Species]
Species 0% 25% 50% 75% 100%
1: setosa 4.3 4.800 5.0 5.2 5.8
2: versicolor 4.9 5.600 5.9 6.3 7.0
3: virginica 4.9 6.225 6.5 6.9 7.9
作成された列の名前は構文的に有効ではないことに注意してください。ただし、を使用して同様の名前変更を行うことができます。setnames
編集
興味深いことに、quantile
を設定すると、結果のベクトルの名前が設定されnames = TRUE
、これがコピーされます(数値の計算が遅くなり、メモリが消費されます。ヘルプで警告することもできます。空想です!)
したがって、おそらく使用する必要があります
IRIS[,as.list(quantile(Sepal.Length, prob = seq(0,1, by = 0.25), names = FALSE)), by = Species]
R
または、内部でコピーせずに名前付きリストを返したい場合
IRIS[,{quant <- as.list(quantile(Sepal.Length, prob = seq(0,1, by = 0.25), names = FALSE))
setattr(quant, 'names', Tukeys_five)
quant}, by = Species]