【发布时间】:2016-07-21 17:53:58
【问题描述】:
在我的组(“名称”变量)中,我想将值分成四分位数。并为变量“值”创建一个四分位标签列。由于组大小不同,对于不同组的四分位范围变化。 但在下面的代码中,仅将四分位数除以整体值,导致所有组相同的四分位数 范围。
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 是因素,而是 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
【问题讨论】:
-
您可以强制转换为
numeric,因为cut输出为factor,即as.numeric(cut(...或使用findInterval -
@akrun 感谢您指出获取四分位数数字标签的方法。但问题是 newcol 在所有不同的组中具有相同的四分位数范围。我将更新问题以澄清这一点。
标签: r dplyr data-manipulation