我看到很多的问题和答案再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 关注
- 837 浏览
添加回答
举报
0/150
提交
取消