1. ホーム
  2. r

[解決済み] データフレーム内の列を順番に並べてグループ(四分位、十分位など)を素早く作る方法

2023-06-26 08:10:20

質問

多くの質問と回答がありますね。 ordersort . ベクトルやデータフレームをグループ化(四分位値や十分位値など)してソートするものはないのでしょうか?私は手動で解決しましたが、グループでテストされたより良い解決策がありそうです。

これが私の試みです。

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

もっと良い(きれいな/速い/一行で済む)方法はないのでしょうか?ありがとうございます!

どのように解決するのですか?

私が使っている方法は、以下のいずれか、または Hmisc::cut2(value, g=4) :

temp$quartile <- with(temp, cut(value, 
                                breaks=quantile(value, probs=seq(0,1, by=0.25), na.rm=TRUE), 
                                include.lowest=TRUE))

代替案としては

temp$quartile <- with(temp, factor(
                            findInterval( val, c(-Inf,
                               quantile(val, probs=c(0.25, .5, .75)), Inf) , na.rm=TRUE), 
                            labels=c("Q1","Q2","Q3","Q4")
      ))

最初のものは、四分位を値でラベリングするという副作用があり、私はそれを"良いこと"と考えています。次のように使用できます。 labels=cut を追加するか、またはこの行をあなたのコードに追加してください。

temp$quartile <- factor(temp$quartile, levels=c("1","2","3","4") )

あるいはさらに早く、しかし仕組みは少し不明瞭ですが、もはや係数ではなく、数値ベクトルです。

temp$quartile <- as.numeric(temp$quartile)