đây là một giải pháp sử dụng data.table
(trong khi không yêu cầu cụ thể, đó là một lời khen rõ ràng hoặc thay thế cho aggregate
hoặc ddply
.Cũng như là hơi dài để mã, liên tục gọi quantile
sẽ không hiệu quả, như đối với mỗi cuộc gọi mà bạn sẽ được sắp xếp dữ liệu
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
Hoặc, sử dụng một cuộc gọi duy nhất để quantile
sử dụng prob
lập luận thích hợp.
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
Lưu ý rằng tên của các cột được tạo ra không phải là cú pháp hợp lệ, mặc dù bạn có thể đi qua một đổi tên tương tự sử dụng setnames
EDIT
Điều thú vị là, quantile
sẽ thiết lập tên của các vector kết quả nếu bạn đặt names = TRUE
, và điều này sẽ sao chép (làm chậm số crunching và tiêu thụ bộ nhớ - nó thậm chí còn cảnh báo bạn trong sự giúp đỡ, ưa thích đó!)
Do đó, có lẽ bạn nên sử dụng
IRIS[,as.list(quantile(Sepal.Length, prob = seq(0,1, by = 0.25), names = FALSE)), by = Species]
Hoặc, nếu bạn muốn quay trở lại danh sách tên, mà không R
sao chép nội
IRIS[,{quant <- as.list(quantile(Sepal.Length, prob = seq(0,1, by = 0.25), names = FALSE))
setattr(quant, 'names', Tukeys_five)
quant}, by = Species]
Các giá trị trả về là 'data.frame' của bảy cột. Nó không liên quan gì đến 'ma trận'. Có thể nếu bạn cho thấy kết quả bạn mong đợi, sẽ dễ dàng hơn để trả lời câu hỏi này. – nograpes
@nograpes Hãy thử gói dòng mẫu vào 'length()' – mlt
Ha. bạn đúng! – nograpes