为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过对数据框中的列进行排序来快速形成组(四分位数,十分位数等)

如何通过对数据框中的列进行排序来快速形成组(四分位数,十分位数等)

POPMUISE 2019-10-15 16:07:51
我看到很多的问题和答案再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));在这种情况下该做什么是开放式的,所以我让您自己决定。


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 792 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信