【问题标题】:Assign decile for each row according to group根据组为每一行分配十分位数
【发布时间】:2018-12-04 13:42:46
【问题描述】:

我有一个包含 10,000 个观察值的数据框,并且希望有一个新列,其中每一行都有相应的十分位数。十分位分布应按年份分组。最好的方法是什么?

   year       value quartile
1  2000  2.55118169       NA
2  2000  0.79755259       NA
3  2000  0.16918905       NA
4  2001  1.73359245       NA
5  2001  0.41027113       NA
6  2001  0.73012966       NA
7  2002 -1.35901658       NA
8  2002 -0.80591167       NA
9  2002  0.48966739       NA
10 2003  0.88856758       NA
11 2003  0.05146856       NA
12 2003 -0.12310229       NA

【问题讨论】:

  • 在您的示例数据中是十分位还是四分位?
  • 按十分位数,我的数据集每年有数百个值,仅包括上面的一个样本

标签: r


【解决方案1】:

像这样使用dplyr 的东西可能会得到你想要的。假设实际 mydata 中每年有 >= 10 个值。

library(dplyr)
mydata <- mydata %>%
  group_by(year) %>%
  mutate(decile = ntile(value, 10)) %>%
  ungroup()

【讨论】:

  • 试过这个,但多年来它似乎没有给我相同大小的十分位数。例如,我在 2017 年有 500 个观测值,但十分位数 1 有 100 个观测值,而十分位数 10 有 50 个观测值
  • 当我运行时,每组每十分位得到 50 个观察值:tibble(year = c(rep(2016, 500), rep(2017, 500)), value = sample(1:1000, 1000, replace = TRUE)) %&gt;% group_by(year) %&gt;% mutate(decile = ntile(value, 10)) %&gt;% count(decile)。因此,您的数据可能正在发生其他事情。
  • @Alex 你有关系吗?
【解决方案2】:

ave 函数为您提供通过分组因子(在本例中为年份)评估函数的结果。 dplyr::ntile 函数在此处用于获取十分位数。

mydata$decile <- ave(mydata$value, mydata$year, FUN=function(x) { dplyr::ntile(x, 10) } )

【讨论】:

    猜你喜欢
    • 2022-12-04
    • 2021-08-28
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多