【问题标题】:Use ntile() with group_by() with dplyr将 ntile() 与 group_by() 与 dplyr 一起使用
【发布时间】:2019-12-18 12:22:31
【问题描述】:

我想计算 data.frame 中组的五分位数,例如:

df <- data.frame(x=1:100, y=c(rep("A", 50), rep("B", 50)))

使用ntile() 函数和来自dplyrgroup_by,我想我可以得到分组的五分位数,例如这里。但是,正如我们从表中看到的,五分位数是针对整个数据集计算的。我想得到一个结果,在这种情况下,AB 的每个五分位数都有10

df$z <- df %>% group_by(y) %>% mutate(z = ntile(x, 5)) %>% pull(z)

table(df$y, df$z)

     1  2  3  4  5
  A 20 20 10  0  0
  B  0  0 10 20 20

【问题讨论】:

  • 您的 mutate 语句已将列 z 添加到您的 data.frame,因此无需将其分配给新列。相反,您可以使用df &lt;- df %&gt;% group_by(y) %&gt;% mutate(z = ntile(x, 5)) %&gt;% ungroup()。这不会解决您的问题,但我认为使用 dplyr::mutate 会起作用。可能您的代码正在使用的 mutate 版本来自 plyr 包。
  • 无法重现您的示例。对我来说,您的代码按预期工作。也许尝试开始一个新的 R 会话。

标签: r dataframe dplyr group-by percentile


【解决方案1】:

确保开始一个新的 R 会话并尝试以下操作:

library(dplyr)
df <- data.frame(x=1:100, y=c(rep("A", 50), rep("B", 50))) %>% 
   group_by(y) %>% mutate(z = ntile(x, 5))

table(df$y, df$z)
     1  2  3  4  5
  A 10 10 10 10 10
  B 10 10 10 10 10

另外,dplyr 替代 table 将是 count

count(df, y, z)

【讨论】:

  • 是的,成功了!我要看看是哪个(如果有的话)包导致它不起作用。
  • plyr 包,可能覆盖了dplyrgroup_by 函数。
猜你喜欢
  • 2021-07-20
  • 2019-11-29
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
相关资源
最近更新 更多