我看到很多的問題和答案再order和sort。有什么東西可以將向量或數據幀分類為分組(如四分位數或十分位數)?我有一個“手動”解決方案,但是可能有一個經過小組測試的更好的解決方案。這是我的嘗試:temp <- data.frame(name=letters[1:12], value=rnorm(12), quartile=rep(NA, 12))temp# name value quartile# 1 a 2.55118169 NA# 2 b 0.79755259 NA# 3 c 0.16918905 NA# 4 d 1.73359245 NA# 5 e 0.41027113 NA# 6 f 0.73012966 NA# 7 g -1.35901658 NA# 8 h -0.80591167 NA# 9 i 0.48966739 NA# 10 j 0.88856758 NA# 11 k 0.05146856 NA# 12 l -0.12310229 NAtemp.sorted <- temp[order(temp$value), ]temp.sorted$quartile <- rep(1:4, each=12/4)temp <- temp.sorted[order(as.numeric(rownames(temp.sorted))), ]temp# name value quartile# 1 a 2.55118169 4# 2 b 0.79755259 3# 3 c 0.16918905 2# 4 d 1.73359245 4# 5 e 0.41027113 2# 6 f 0.73012966 3# 7 g -1.35901658 1# 8 h -0.80591167 1# 9 i 0.48966739 3# 10 j 0.88856758 4# 11 k 0.05146856 2# 12 l -0.12310229 1有沒有更好的方法(更清潔/更快/單線)?謝謝!
3 回答

慕萊塢森
TA貢獻1810條經驗 獲得超4個贊
我將為data.table其他所有使用該版本的人添加該版本(即,@ BondedDust的解決方案已翻譯data.table并削減了一點):
library(data.table)
setDT(temp)
temp[ , quartile := cut(value,
breaks = quantile(value, probs = 0:4/4),
labels = 1:4, right = FALSE)]
這比我一直做的更好(更干凈,更快):
temp[ , quartile :=
as.factor(ifelse(value < quantile(value, .25), 1,
ifelse(value < quantile(value, .5), 2,
ifelse(value < quantile(value, .75), 3, 4))]
但是請注意,這種方法要求分位數是不同的,例如它將失敗rep(0:1, c(100, 1));在這種情況下該做什么是開放式的,所以我讓您自己決定。
- 3 回答
- 0 關注
- 876 瀏覽
添加回答
舉報
0/150
提交
取消