2017-06-29 557 views
0

我有一個有304行和32個變量的數據框。我想爲每兩行(即,行1 +行2,行3 +行4,行5 +行6等)從列A和列B的值求和。在OUTPUT列中,您可以看到我想要獲得的內容。R列中每兩行加總列

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

你的方法對我的作品。你遇到了什麼錯誤? – HFBrowning

+0

@HFBrowning我得到:'0 1023 479 926 289 527 276 660 364 799 542 879 539 1017 602 1168 403 632 535 620 424 850 585 1132 499 706 286 478 800 1308' – dede

回答

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

下面是使用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的數據框,可以用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") 
+0

它給了我這個錯誤:'RowSums( dat):'x'必須是數字' – dede

+0

這意味着至少有一列不是數字,因此計算總和沒有意義。它適用於您提供的示例,該示例在我的答案結尾處提供了內容(將第三列預期輸出刪除)。 – lmo

+0

是的,兩列中的一列是數字,另一列是整數。 – dede