我正在尝试为我的作业建立一个汇总表。我用来聚合的变量是二进制变量(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.我该怎么做?有任何想法吗?谢谢!
答案 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")