グループ内(「名前」変数)、値をの四分円にカットします。そして変数 "value"の四分円ラベル列を作成します。グループは、、、異なるグループの、,のように変化するので、 以下のコードでは、四分位数を全体の値で切り捨てるだけで、と同じ四分円の範囲がすべてのグループに適用されます。さまざまなグループサイズのグループ別ラベル分け
dt<-data.frame(name=c(rep('a',8),rep('b',4),rep('c',5)),value=c(1:8,1:4,1:5))
dt
dt.2<-dt%>% group_by(name)%>% mutate(newcol=
cut(value,breaks=quantile(value,probs=seq(0,1,0.25),na.rm=TRUE),include.lowest=TRUE))
dt.2
str(dt.2)
データ:上記のコードから
name value
1 a 1
2 a 2
3 a 3
4 a 4
5 a 5
6 a 6
7 a 7
8 a 8
9 b 1
10 b 2
11 b 3
12 b 4
13 c 1
14 c 2
15 c 3
16 c 4
17 c 5
出力。 更新:問題はnewcolがfactorであるのではなく、necolが異なるグループ全体で同じ四分位範囲を持つことです。たとえば、名前bの場合、値は1-4ですが、四分位範囲は3-5で、グループに関係なくmin(value)からmax(value)に派生します。
name value newcol
<fctr> <int> <fctr>
1 a 1 [1,2]
2 a 2 [1,2]
3 a 3 (2,3]
4 a 4 (3,5]
5 a 5 (3,5]
6 a 6 (5,8]
7 a 7 (5,8]
8 a 8 (5,8]
9 b 1 [1,2]
10 b 2 [1,2]
11 b 3 (2,3]
12 b 4 (3,5]
13 c 1 [1,2]
14 c 2 [1,2]
15 c 3 (2,3]
16 c 4 (3,5]
17 c 5 (3,5]
所望の出力
name value newcol/quartile label
1 a 1 1
2 a 2 1
3 a 3 2
4 a 4 2
5 a 5 3
6 a 6 3
7 a 7 4
8 a 8 4
9 b 1 1
10 b 2 2
11 b 3 3
12 b 4 4
13 c 1 1
14 c 2 2
15 c 3 3
16 c 4 4
17 c 5 4
を'cut'の出力が' factor 'なので 'numeric'に強制することができます。つまり' as.numeric(cut(... 'または' findInterval'を使います。 – akrun
@akrun四分位の数値ラベルを取得する方法を指摘してくれてありがとう。しかし、問題はnewcolがすべての異なるグループにわたって同じ四分位範囲を持つことです。それを明確にするために質問を更新します。 – alphabetagamma