我想对前3行的数量求和,然后对后3行的数量求和,依此类推。基本上,每三行求和。
下面是可复制的代码:
id <- 1:15
numbers <- 6:20
df <- data.frame(id, numbers)
请帮助,谢谢!在我的真实数据中,我需要对每550行进行求和。
答案 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