【问题标题】:generate q1/q3 as variables by group in R在 R 中按组生成 q1/q3 作为变量
【发布时间】:2017-09-20 19:35:00
【问题描述】:

我有一个两级数据(医院级和地区级),每个医院都有一个唯一的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 生成 o:e 的 25% 分位数和 75% 分位数,这样输出会是这样的:

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

有什么建议吗? 谢谢!!

【问题讨论】:

    标签: r data-management


    【解决方案1】:
    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")
    

    【讨论】:

    • 我认为最好在您的答案中包含df[c("q1", "q3")] <- lapply(c(2, 4), function(i) with(df, ave(o.e, zipid, FUN = function(x) quantile(x)[i])))。我会删除那部分
    【解决方案2】:

    我们可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-25
      • 2020-09-16
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2013-07-08
      相关资源
      最近更新 更多