R:是否有将相同因子聚合成不同组的功能?

时间:2016-09-08 07:38:33

标签: r

我正在尝试为我的作业建立一个汇总表。我用来聚合的变量是二进制变量(0/1)。

total <-aggregate(result ~sex, data=x,sum)

但是,我希望每隔几个0和每几个1聚合成不同的组。 例如:

Sex= 1 1 1 1 0 0 1 1
result = 5 1 10 6 7 8 3 2 

我想得到的表将是性别1结果22,性别0结果15,性别1结果5.我该怎么做?有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

我们可以使用rleid中的data.table进行分组,然后获取sum'结果'

library(data.table)
setDT(x)[, .(Sex = Sex[1L],result = sum(result)), by = .(grp= rleid(Sex))][, grp := NULL][]
#    Sex result
#1:   1     22
#2:   0     15
#3:   1      5

或使用dplyr

library(dplyr)
x %>% 
  group_by(grp = cumsum(Sex!= lag(Sex, default = Sex[1]))+1) %>% 
  summarise(Sex = first(Sex), result = sum(result)) %>%
  select(-grp)
#   Sex result
#   <dbl>  <dbl>
#1     1     22
#2     0     15 
#3     1      5

这也适用于aggregate

aggregate(result ~cbind(Sex = cumsum(c(1, diff(Sex) != 0))), x, sum)

编辑:将aggregate中的分组变量从rleid(Sex)更改为@Sotos提供的link中显示的选项之一

数据

x <- structure(list(Sex = c(1, 1, 1, 1, 0, 0, 1, 1), result = c(5, 
1, 10, 6, 7, 8, 3, 2)), .Names = c("Sex", "result"), row.names = c(NA, 
-8L), class = "data.frame")