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

我看到很多的问题和答案再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       NA

temp.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

有没有更好的方法(更清洁/更快/单线)?谢谢!


POPMUISE
浏览 786回答 3
3回答

慕莱坞森

我将为data.table其他所有使用该版本的人添加该版本(即,@ BondedDust的解决方案已翻译data.table并削减了一点):library(data.table)setDT(temp)temp[ , quartile := cut(value,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; breaks = quantile(value, probs = 0:4/4),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; labels = 1:4, right = FALSE)]这比我一直做的更好(更干净,更快):temp[ , quartile :=&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; as.factor(ifelse(value < quantile(value, .25), 1,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ifelse(value < quantile(value, .5), 2,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifelse(value < quantile(value, .75), 3, 4))]但是请注意,这种方法要求分位数是不同的,例如它将失败rep(0:1, c(100, 1));在这种情况下该做什么是开放式的,所以我让您自己决定。
打开App,查看更多内容
随时随地看视频慕课网APP