使用dplyr的group_by()和ntile()函数。

5
我想计算一个数据框中每个分组的五分位数,例如这样的数据框:
df <- data.frame(x=1:100, y=c(rep("A", 50), rep("B", 50)))

使用dplyrntile()函数和group_by,我认为可以得到如此处所示的分组五分位数。然而,正如我们从表中所看到的那样,五分位数是针对整个数据集计算的。在这种情况下,我想要得到每个五分位数中都有AB10个结果。

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

你的变异语句已经向你的数据框添加了一个列z,因此不必将其分配给新列。相反,您可以执行df <- df %>% group_by(y) %>% mutate(z = ntile(x, 5)) %>% ungroup()。这不会解决您的问题,但我认为使用dplyr :: mutate会起作用。您的代码正在使用的变异版本可能来自plyr包。 - Bas
无法重现您的示例。 对我来说,您的代码按预期工作。也许尝试启动一个新的R会话。 - Cettt
1个回答

7
请确保启动一个新的 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)

是的,它起作用了!我要看看是哪个(如果有的话)软件包导致它无法工作。 - Marco Pastor Mayo
这是 plyr 包,可能覆盖了 dplyrgroup_by 函数。 - Marco Pastor Mayo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接