R中每两行汇总一列

时间:2017-06-29 17:37:32

标签: r sum row

我有一个包含304行和32个变量的数据帧。我想对每2行(即row1 + row2,row3 + row4,row5 + row6等)的A列和B列的值求和。在OUTPUT列中,您可以看到我想要获得的内容。

 A      B   OUTPUT  
 0      23  0       #row1
 1000   0   1023    #row2
 0      12  0       #row3
 914    0   926     #row4
 0      25  0       #row5
 502    0   527     #row6
 0      16  0       #row7
 644    0   660     #row8
 0      23  0       #row9
 776    0   799     #row10
 0      19  0       #row11
 860    0   879     #row12
 0      25  0       #row13
 992    0   1017    #row14
 0      15  0       #row15
 1153   0   1168    #row16
 0      17  0       #row17
 615    0   632     #row18
 0      32  0       #row19
 588    0   620     #row20
 0      36  0       #row21
 814    0   850     #row22
 0      29  0       #row23
 1103   0   1132    #row24
 0      16  0       #row25
 690    0   706     #row26
 0      22  0       #row27
 456    0   478     #row28
 0      16  0       #row29
 1292   0   1308    #row30

我尝试过使用:

 library(RcppRoll)
 df1$OUTPUT <- with(df1, round(roll_sumr((df1$A + df1$B), n = 2, by=2,  fill = 0)))

但它不起作用。任何建议都将非常感谢。

2 个答案:

答案 0 :(得分:2)

这是许多可能的解决方案之一:

df1 <- structure(list(A = c(0L, 1000L, 0L, 914L, 0L, 502L, 0L, 644L, 
0L, 776L, 0L, 860L, 0L, 992L, 0L, 1153L, 0L, 615L, 0L, 588L, 
0L, 814L, 0L, 1103L, 0L, 690L, 0L, 456L, 0L, 1292L), B = c(23L, 
0L, 12L, 0L, 25L, 0L, 16L, 0L, 23L, 0L, 19L, 0L, 25L, 0L, 15L, 
0L, 17L, 0L, 32L, 0L, 36L, 0L, 29L, 0L, 16L, 0L, 22L, 0L, 16L, 
0L), OUTPUT = c(0L, 1023L, 0L, 926L, 0L, 527L, 0L, 660L, 0L, 
799L, 0L, 879L, 0L, 1017L, 0L, 1168L, 0L, 632L, 0L, 620L, 0L, 
850L, 0L, 1132L, 0L, 706L, 0L, 478L, 0L, 1308L)), .Names = c("A", 
"B", "OUTPUT"), class = "data.frame", row.names = c(NA, -30L))

df1$OUTPUT <- c(0, sapply(2:nrow(df1), function(k) df1$A[k]+df1$B[k-1]))

head(df1)
#      A  B OUTPUT
# 1    0 23      0
# 2 1000  0   1023
# 3    0 12      0
# 4  914  0    926
# 5    0 25      0
# 6  502  0    527

答案 1 :(得分:2)

这是使用tapply和模数运算符%%的基本R方法。

dat$temp <- unlist(tapply(rowSums(dat), list(cumsum(seq_len(nrow(dat)) %% 2)),
                          FUN=function(x) c(0, sum(x))))

这里,计算行总和并将其输入tapply的第一个参数。执行分组的第二个参数计算为模数2的行的累积和。该函数返回与每个组的总和连接的0。在这里,tapply会返回一个列表,该列表会转换为带有unlist的数字向量。

结果的前六行是

head(dat)
     A  B temp
1    0 23    0
2 1000  0 1023
3    0 12    0
4  914  0  926
5    0 25    0
6  502  0  527

请注意,rowSums(dat)会尝试对整个data.frame执行逐行求和。如果您的data.frame有超过2列,并且您希望将操作限制为特定的两列,则需要对此参数进行子集化。根据OP中的代码,使用名为df1的data.frame,您可以将其替换为rowSums(df1[c("A", "B")])以获得所需的结果。

数据

    dat <-
    structure(list(A = c(0L, 1000L, 0L, 914L, 0L, 502L, 0L, 644L, 
    0L, 776L, 0L, 860L, 0L, 992L, 0L, 1153L, 0L, 615L, 0L, 588L, 
    0L, 814L, 0L, 1103L, 0L, 690L, 0L, 456L, 0L, 1292L), B = c(23L, 
    0L, 12L, 0L, 25L, 0L, 16L, 0L, 23L, 0L, 19L, 0L, 25L, 0L, 15L, 
    0L, 17L, 0L, 32L, 0L, 36L, 0L, 29L, 0L, 16L, 0L, 22L, 0L, 16L, 
    0L)), .Names = c("A", "B"), row.names = c(NA, -30L), class = "data.frame")