我有一个包含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)))
但它不起作用。任何建议都将非常感谢。
答案 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")