我有一个数据帧,其中每个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时,总结工作正常。
答案 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
请注意,如果您的id
和group
不是像您的示例那样直截了当的通讯对象(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