【问题标题】:R quantile by groups with assignmentsR 分位数按组分配
【发布时间】:2016-02-17 10:24:13
【问题描述】:

我有以下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
          .......

有一种复杂的方法可以在每个组上使用循环和剪切函数,但它根本没有效率。有人知道更好的解决方案吗?

谢谢!

【问题讨论】:

  • 您可以使用tapply(df$variable, df$group, FUN = function(x) quantile(x, prob = 0.5), simplify = TRUE)aggregate 之类的其他内容,甚至可以使用包dplyr
  • 它适用于计算分位数,但不会将每个人分配给 df 中自己的分位数。

标签: r quantile tapply


【解决方案1】:

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

【讨论】:

  • 您能解释一下您的函数中的“:=”和 setDT(df),谢谢。它工作得很好:)!
  • 它是data.table 语法的一部分,您可以阅读更多关于它的信息here
【解决方案2】:

另一个带有dplyr/findInterval的版本

library(dplyr)
df %>%
  group_by(group) %>% 
  mutate(Quantile = findInterval(variable, 
                quantile(variable, probs=0:4/4)))

【讨论】:

  • 与@mtoto 的data.table 解决方案相比,这不会在“组”内创建分组,而只是在整体上。
  • @Dima。也许您还加载了具有mutateplyr,它掩盖了dplyr::mutate。使用。 dplyr::mutate 明确
  • 非常感谢!你完全正确。但是,这也会产生与data.table 解决方案略有不同的结果。这些差异显然是由于四分位数边界的不同组分配:dplyr 分配给下一个 更高 组的值等于四分位数,data.table 分配给下一个 更低 组。此外,在我的数据集中,dplyr 解决方案甚至将一些值分配给 fifth 组。这些就是组最大值。因此,这两种方法似乎都使用不同的值舍入或不同的“>=”符号。
  • @Dima 可以通过更改findInterval中的一些参数来修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2019-11-22
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
相关资源
最近更新 更多