我有这些数据,我希望以三个为一组的行汇总,1-3,4-6,7-9,10-12。在我的数据框中,我有48行和795个变量。你能帮帮我吗?
我的数据框:
X1 X2 X3 X4 X5 X6 X7 X8 X9
1 0.00 0.00 136.29 0.00 60.52 0.00 0.00 0.00 0.00
2 0.00 0.00 4658.69 0.00 0.00 1749.50 0.00 0.00 0.00
3 0.00 0.00 0.00 0.00 0.00 125.86 0.00 0.00 0.00
4 0.00 0.00 119.34 0.00 0.00 0.00 0.00 0.00 0.00
5 0.00 0.00 4674.16 2107.55 0.00 0.00 0.00 0.00 0.00
6 0.00 0.00 0.00 0.00 0.00 5689.40 0.00 0.00 0.00
7 4270.87 0.00 0.00 0.00 0.00 3275.74 0.00 0.00 0.00
8 0.00 455.04 0.00 0.00 0.00 1296.30 0.00 0.00 0.00
9 0.00 0.00 0.00 0.00 0.00 9887.52 0.00 0.00 0.00
10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11 0.00 0.00 0.00 0.00 2169.64 0.00 0.00 0.00 699.93
12 0.00 12524.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00
这就是我想要的:
X1 X2 X3 X4 X5 X6 X7 X8 X9
1 0.00 0.00 ......
2 0.00 0.00 ......
3 4270.87 455.04 ......
4 0.00 12524.50 ......
答案 0 :(得分:4)
使用filter
的基础R解决方案(stats::filter
- 如果已加载dplyr
推土机,请注意):
data.frame(lapply(df, function(x) filter(x, c(1,1,1), sides=1)[seq(3, nrow(df), 3)] ))
# X1 X2 X3 X4 X5 X6 X7 X8 X9
#1 0.00 0.00 4794.98 0.00 60.52 1875.36 0 0 0.00
#2 0.00 0.00 4793.50 2107.55 0.00 5689.40 0 0 0.00
#3 4270.87 455.04 0.00 0.00 0.00 14459.56 0 0 0.00
#4 0.00 12524.50 0.00 0.00 2169.64 0.00 0 0 699.93
正如@alexis_laz上面注释?rowsum
可能更可取,因为它是为此目的明确定义的,其形式如下:
rowsum(data, appropriate_grouping_vector)
所以,比如:
rowsum(dat, (1:nrow(dat) - 1) %/% 3)
# X1 X2 X3 X4 X5 X6 X7 X8 X9
#0 0.00 0.00 4794.98 0.00 60.52 1875.36 0 0 0.00
#1 0.00 0.00 4793.50 2107.55 0.00 5689.40 0 0 0.00
#2 4270.87 455.04 0.00 0.00 0.00 14459.56 0 0 0.00
#3 0.00 12524.50 0.00 0.00 2169.64 0.00 0 0 699.93
答案 1 :(得分:1)
以下代码是从其来源(Summing columns on every nth row of a data frame in R)修改的dplyr
解决方案。
它通过创建用于对行进行分组的索引变量来解决问题,然后获取这些子集行的rowums。如果n
可以被nrow(df)
整除,n
可以取任何价值。
df <- data.frame(runif(30), runif(30), runif(30))
library(plyr); library(dplyr)
n <- 3
df %>%
group_by(indx = gl(ceiling(nrow(df)/n), n, nrow(df))) %>%
summarise_each(funs(sum))
答案 2 :(得分:0)
在n行上拆分数据,然后求和:
# dummy data
df1 <- mtcars[1:12, 1:6]
# split sum combine
t(sapply(split(df1, rep(1:4, each = 3)), colSums))
答案 3 :(得分:0)
这也有效:
df$group <- ceiling((1:nrow(df))/3)
aggregate(. ~ group, data = df, sum)[-1]
X1 X2 X3 X4 X5 X6 X7 X8 X9
1 0.00 0.00 4794.98 0.00 60.52 1875.36 0 0 0.00
2 0.00 0.00 4793.50 2107.55 0.00 5689.40 0 0 0.00
3 4270.87 455.04 0.00 0.00 0.00 14459.56 0 0 0.00
4 0.00 12524.50 0.00 0.00 2169.64 0.00 0 0 699.93