每3行加总

时间:2019-12-27 19:52:55

标签: r dataframe aggregate

我想对前3行的数量求和,然后对后3行的数量求和,依此类推。基本上,每三行求和。

enter image description here

下面是可复制的代码:

id <- 1:15
numbers <- 6:20
df <- data.frame(id, numbers)

请帮助,谢谢!在我的真实数据中,我需要对每550行进行求和。

3 个答案:

答案 0 :(得分:5)

基于R的解决方案:

grp = (1:nrow(df) - 1)%/%3
data.frame(
    range = aggregate(df$id, list(grp),
                      function(x) paste(range(x), collapse=" -- "))$x,
    sum = aggregate(df$numbers, list(grp), sum)$x,
    stringsAsFactors = FALSE)

##      range sum
## 1   1 -- 3  21
## 2   4 -- 6  30
## 3   7 -- 9  39
## 4 10 -- 12  48
## 5 13 -- 15  57

答案 1 :(得分:3)

我们可以使用gl创建分组变量,然后获取sum

library(dplyr)
library(stringr)
n1 <- 3 # change to 550
df %>%
   group_by(grp = as.integer(gl(n(), n1, n()))) %>%
   summarise(range = str_c(first(id), last(id), sep=" -- "), sum = sum(numbers)) %>%
   select(-grp)
# A tibble: 5 x 2
#  range      sum
#  <chr>    <int>
#1 1 -- 3      21
#2 4 -- 6      30
#3 7 -- 9      39
#4 10 -- 12    48
#5 13 -- 15    57

答案 2 :(得分:3)

使用matrix()重塑数据框的基本R解决方案

dfout <- data.frame(ids = apply(matrix(df$id,nrow = 3),2,function(x) paste0(x[c(1,3)],collapse = "--")),
                    summation = colSums(matrix(df$numbers,nrow = 3)))

如此

> dfout
     ids summation
1   1--3        21
2   4--6        30
3   7--9        39
4 10--12        48
5 13--15        57