总结重复的观察

时间:2019-07-18 13:39:15

标签: r dplyr

我有一个数据帧,其中每个ID都属于一个唯一的组。我希望创建一个汇总表,该表告诉我每个ID的观察次数以及它属于哪个组。

dat=data.frame(id=c(1,1,1,2,2,2,2,3,4,4,4,4,4),group=c(1,1,1,0,0,0,0,1,0,0,0,0,0))
count=dat%>% group_by(id)%>% tally()
## A tibble: 4 x 2
     id     n
  <dbl> <int>
1     1     3
2     2     4
3     3     1
4     4     5

使用上面的代码,我可以计算观察次数。但是我不知道如何为组创建第三列。理想的结果是:

# A tibble: 4 x 3
     id     n group
  <dbl> <int> <dbl>
1     1     3     1
2     2     4     0
3     3     1     1
4     4     5     0

当我这样做

dat %>% group_by(id) %>% summarise(n=count(id), group = unique(group))

我出错了:quickdf(.data [names(cols)])中的错误:length(rows)== 1不是TRUE 但是,当我这样做

dat %>% group_by(id) %>% summarise( group = unique(group))

有效。我很困惑,为什么summary命令不能采用多个参数。 更新:该错误是由另一个名为“ plyr”的软件包引起的。当我脱离plyr时,总结工作正常。

2 个答案:

答案 0 :(得分:3)

我们可以使用count

library(dplyr)
dat %>%
   count(id, group)
# A tibble: 4 x 3
#     id group     n
#  <dbl> <dbl> <int>
#1     1     1     3
#2     2     0     4
#3     3     1     1
#4     4     0     5

答案 1 :(得分:0)

akrun's answer更为优雅,但作为替代方案,您可以简单地将group变量添加到您的group_by()调用中:

library(dplyr)

dat <- tibble(id = c(1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4), 
              group = c(1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0))

dat %>%
  group_by(id, group) %>%
  tally()

# A tibble: 4 x 3
# Groups:   id [4]
     id group     n
  <dbl> <dbl> <int>
1     1     1     3
2     2     0     4
3     3     1     1
4     4     0     5

请注意,如果您的idgroup不是像您的示例那样直截了当的通讯对象(id = 1-> group = 1,id = 2-> group = 0,依此类推),它将为每个组合生成一行(显然非常有用)。例如,

dat2 <- tibble(id = c(1, 1, 1, 2, 2), group = c(1, 0, 0, 1, 0))

dat2 %>%
  group_by(id, group) %>%
  tally()

# A tibble: 4 x 3
# Groups:   id [2]
     id group     n
  <dbl> <dbl> <int>
1     1     0     2
2     1     1     1
3     2     0     1
4     2     1     1