【问题标题】:How to find the quantiles of each variable of a data.frame如何找到data.frame的每个变量的分位数
【发布时间】:2018-11-26 10:06:52
【问题描述】:

我有一个包含多个变量的数据框,我想找到每个变量的分位数 ()

示例代码:

testtable = data.frame(groupvar = c(rep('x',100), rep('y',100)), 
                       numericvar = rnorm(200))

我想将quantile(., c(.05, .1, .25, .5, .75, .9, .95)) 应用于testtable 中的每个变量。理想的结果应该是这样的

   x    y
  .05 .05
  .1  .1
  .25 .25
  .5  .5
  .75 .75
  .9  .9
  .95 .95

其中每个条目是xy 的分位数。例如,.05x 的第 5 个百分位,.1x 的第 10 个百分位分布等。

我在dplyr 中尝试了summarise,但遇到了问题,因为我的quantile 函数返回一个长度为7 的向量。

最好的方法是什么?

【问题讨论】:

    标签: r dplyr apply lapply summarize


    【解决方案1】:

    这是一个基本 R 解决方案,其中我们unstack 数据框并计算每列的分位数,即每个分位数,即

    sapply(unstack(testtable, numericvar ~ groupvar), function(i) quantile(i, v1))
    

    给出,

                  x           y
    5%  -1.82980882 -1.49900735
    10% -1.26047295 -1.02626933
    25% -0.83928910 -0.68248217
    50%  0.02757385 -0.02096953
    75%  0.64842517  0.48624513
    90%  1.63382801  1.09722178
    95%  1.91104161  1.72846846
    

    在哪里v1 <- c(0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95)

    【讨论】:

    • 稍微短一点:sapply(unstack(testtable, numericvar ~ groupvar), quantile, probs = v1)
    【解决方案2】:

    lapply的另一种可能,我们需要先转换为list

    l <- split(testtable$numericvar, testtable$groupvar)
    

    现在我们可以得到quantile,然后转换回data.frame

    ll <- lapply(l, function(x) quantile(unlist(x), c(.05, .1, .25, .5, .75, .9, .95)))
    as.data.frame(ll)
    #             x           y
    # 5%  -1.8028162 -1.69293054
    # 10% -1.3129427 -1.23125086
    # 25% -0.7335853 -0.57010352
    # 50% -0.1223181  0.05119533
    # 75%  0.6727871  0.66203631
    # 90%  1.3411195  1.08830220
    # 95%  1.7068070  1.54248740
    

    这可以在一个函数中调用,你可以添加更多使其更通用:

    quantile_grouped <- function(data, group_var = "groupvar", quantile_var = "numericvar") {
    
      l <- split(testtable[, quantile_var], testtable[, group_var ])
    
      ll <- lapply(l, function(x) quantile(unlist(x), c(.05, .1, .25, .5, .75, .9, .95)))
      as.data.frame(ll)
    
    }
    quantile_grouped(testtable)
    

    【讨论】:

    • 对于你的第一行,你可以通过简单地做split(testtable$numericvar, testtable$groupvar)来避免lapply
    【解决方案3】:

    另一种选择:

    pr <- c(0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95)
    as.data.frame.list(tapply(testtable$numericvar, testtable$groupvar,
                              quantile, probs = pr))
    

    给出:

                  x          y
    5%  -1.57823487 -1.5142682
    10% -1.28807795 -1.2153000
    25% -0.60598752 -0.6889401
    50% -0.07536852 -0.2036487
    75%  0.57269482  0.4892494
    90%  1.04087379  1.2231926
    95%  1.22329927  1.7421848
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 2020-08-21
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多