如何按滚动3行块对R语言DataFrame进行聚合求和?
解决滚动窗口分组求和的问题
要实现你想要的滚动3行分组(比如a-b-c、c-d-e这类重叠窗口)并使用aggregate求和,关键是先自动生成滚动窗口的分组标签,再基于标签聚合。下面是具体步骤和代码:
步骤1:生成滚动窗口的分组标签
首先定义窗口大小(这里是3)和滑动步长(你例子里是2,因为窗口重叠1个元素),然后为每个窗口生成对应的分组字符串:
# 你的原始DataFrame df <- data.frame(score=letters[1:15], total1=1:15, total2=16:30) # 定义窗口参数 window_size <- 3 step <- 2 # 步长为2,实现窗口重叠1个元素 # 计算每个窗口的起始索引,确保不超出数据行数 start_indices <- seq(1, nrow(df), by = step) start_indices <- start_indices[start_indices + window_size - 1 <= nrow(df)] # 生成每个窗口的分组名称(如"a-b-c") group_names <- sapply(start_indices, function(i) { paste(df$score[i:(i + window_size - 1)], collapse = "-") })
步骤2:为数据框添加分组标签
把每个窗口对应的行标记为同一个分组:
df$group <- NA for (i in seq_along(start_indices)) { row_range <- start_indices[i]:(start_indices[i] + window_size - 1) df$group[row_range] <- group_names[i] }
步骤3:使用aggregate求和
现在就可以按分组标签聚合total1和total2的和了:
result <- aggregate(cbind(total1, total2) ~ group, data = df, FUN = sum) # 重命名列名符合你的预期 colnames(result) <- c("groups", "sum1", "sum2") print(result)
运行后你会得到类似这样的结果:
groups sum1 sum2 1 a-b-c 6 51 2 c-d-e 12 57 3 e-f-g 18 63 4 g-h-i 24 69 5 i-j-k 30 75 6 k-l-m 36 81 7 m-n-o 42 87
为什么你之前的方法不对?
你之前用df$score %in% c('a','b','c')这种方式手动指定分组,不仅无法自动化处理滚动窗口,还会把分散的行(如果存在重复值的话)归为一组,完全不符合滚动连续窗口的需求。而通过自动生成连续窗口的分组标签,就能完美匹配你的需求啦。
内容的提问来源于stack exchange,提问作者esem
相关产品推荐
相关产品推荐

