我有以下df:
group = rep(seq(1,3),30)
variable = runif(90, 5.0, 7.5)
df = data.frame(group,variable)
我需要i)按组定义分位数,ii)将每个人分配给她的分组。
因此,输出看起来像:
id group variable quantile_with_respect_to_the_group
1 1 6.430002 1
2 2 6.198008 3
.......
有一种复杂的方法可以在每个组中使用循环和剪切功能,但它根本没有效率。有人知道更好的解决方案吗?
谢谢!
答案 0 :(得分:2)
在data.table
:
library(data.table)
setDT(df)[,quantile := cut(variable, quantile(variable, probs = 0:4/4),
labels = FALSE, include.lowest = TRUE), by = group]
>head(df)
# group variable quantile
# 1: 1 6.103909 2
# 2: 2 6.511485 3
# 3: 3 5.091684 1
# 4: 1 6.966461 4
# 5: 2 6.613441 4
答案 1 :(得分:1)
dplyr/findInterval
library(dplyr)
df %>%
group_by(group) %>%
mutate(Quantile = findInterval(variable,
quantile(variable, probs=0:4/4)))