我有两级数据(医院级别和地区级别),每家医院都有一个独特的o:e:
hospid zipid o:e
1 1 0.8
2 1 0.5
3 1 0.4
4 2 0.9
5 2 1.2
6 2 1.5
我想通过zipid生成25%的分位数和75%的o:e分位数,这样输出就像这样:
hospid zipid o:e q1 q3
1 1 0.8 0.9 1.05
2 1 0.5 0.9 1.05
3 1 0.4 0.9 1.05
4 2 0.9 1.0 1.10
5 2 1.2 1.0 1.10
6 2 1.5 1.0 1.10
我找到了一个可以显示精确分位数的R代码,但不知道如何提取 这些值并根据这些值生成新变量。
do.call("rbind", tapply(data$oe, data$zipid, quantile))
0% 25% 50% 75% 100%
region1 0.93 0.99 1.02 1.04 1.11
region2 0.54 0.92 1.02 1.07 1.16
有什么建议吗? 谢谢!
答案 0 :(得分:2)
df$q1 = ave(df$o.e, df$zipid, FUN = function(x) quantile(x)[2])
df$q3 = ave(df$o.e, df$zipid, FUN = function(x) quantile(x)[4])
df
# hospid zipid o.e q1 q3
#1 1 1 0.8 0.45 0.65
#2 2 1 0.5 0.45 0.65
#3 3 1 0.4 0.45 0.65
#4 4 2 0.9 1.05 1.35
#5 5 2 1.2 1.05 1.35
#6 6 2 1.5 1.05 1.35
数据强>
df = structure(list(hospid = 1:6, zipid = c(1L, 1L, 1L, 2L, 2L, 2L
), o.e = c(0.8, 0.5, 0.4, 0.9, 1.2, 1.5), q1 = c(0.45, 0.45,
0.45, 1.05, 1.05, 1.05), q3 = c(0.65, 0.65, 0.65, 1.35, 1.35,
1.35)), .Names = c("hospid", "zipid", "o.e", "q1", "q3"), row.names = c(NA,
-6L), class = "data.frame")
答案 1 :(得分:1)
我们可以使用data.table
创建列
library(data.table)
setDT(df)[, c('q1', 'q3') := as.list(quantile(o.e)[c(2, 4)]), zipid]
df
# hospid zipid o.e q1 q3
#1: 1 1 0.8 0.45 0.65
#2: 2 1 0.5 0.45 0.65
#3: 3 1 0.4 0.45 0.65
#4: 4 2 0.9 1.05 1.35
#5: 5 2 1.2 1.05 1.35
#6: 6 2 1.5 1.05 1.35