在R中按组生成q1 / q3作为变量

时间:2017-09-20 19:35:00

标签: r data-management

我有两级数据(医院级别和地区级别),每家医院都有一个独特的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

有什么建议吗? 谢谢!

2 个答案:

答案 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