使用dplyr计算group_by中的子组

时间:2017-04-29 01:27:28

标签: r dplyr

我试图对数据框进行一些计数。要点是按一个变量分组,然后根据第二个变量进一步分组。从这里我想计算每个组的子组的大小。示例代码如下:

set.seed(123456)
df <- data.frame(User = c(rep("A", 5), rep("B", 4), rep("C", 6)), 
                 Rank = c(rpois(5,1), rpois(4,2), rpois(6,3)))

#This results in an error
df %>% group_by(User) %>% group_by(Rank) %>% summarize(Res = n_groups())

所以我想要的是&#39;用户A&#39;拥有3,&#39;用户B&#39;拥有4个用户C&#39;换句话说,数据框df最终看起来像:

   User Rank Result
1     A    2      3
2     A    2      3
3     A    1      3
4     A    0      3
5     A    0      3
6     B    1      4
7     B    2      4
8     B    0      4
9     B    6      4
10    C    1      5
11    C    4      5
12    C    3      5
13    C    5      5
14    C    5      5
15    C    8      5

我还在学习dplyr,所以我不确定应该怎么做。怎么能实现这一目标?非dplyr答案也非常受欢迎。提前致谢!

2 个答案:

答案 0 :(得分:6)

试试这个:

df %>% group_by(User) %>% mutate(Result=length(unique(Rank)))

或(见下面的评论):

df %>% group_by(User) %>% mutate(Result=n_distinct(Rank))

答案 1 :(得分:0)

base R选项将使用ave

df$Result <- with(df, ave(Rank, User, FUN = function(x) length(unique(x))))
df$Result
#[1] 3 3 3 3 3 4 4 4 4 5 5 5 5 5 5

data.table选项

library(data.table)
setDT(df)[, Result := uniqueN(Rank), by = User]