2017-06-29 21 views
0

Ich habe einen Datenrahmen mit 304 Zeilen und 32 Variablen. Ich möchte die Werte aus Spalte A und Spalte B für jeweils 2 Zeilen summieren (d. H. Zeile1 + Zeile2, Zeile3 + Zeile4, Zeile5 + Zeile6 usw.). In der Spalte OUTPUT können Sie sehen, was ich erhalten möchte.Summe Spalten alle zwei Zeilen in 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 

Ich habe versucht mit:

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

Aber es funktioniert nicht. Jeder Vorschlag würde sehr geschätzt werden.

+0

Ihr Ansatz funktioniert für mich. Welchen Fehler bekommst du? – HFBrowning

+0

@HFBrowning Ich bekomme: '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

Antwort

2

Dies ist eine der vielen möglichen Lösungen:

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

Hier ist ein Verfahren, Basis R tapply und den Modulus-Operator, %%.

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

Hier werden die Zeilensummen berechnet und an das erste Argument von tapply zugeführt. Das zweite Argument, das die Gruppierung durchführt, wird als kumulative Summe der Zeilen berechnet, die Modul 2 sind. Die Funktion gibt eine 0 zurück, die mit der Summe der einzelnen Gruppen verkettet ist. Hier gibt tapply eine Liste zurück, die mit unlist in einen numerischen Vektor umgewandelt wird.

Die ersten sechs Zeilen des Ergebnisses sind

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 

Beachten Sie, dass rowSums(dat) versuchen eine zeilenweise Summe Ihrer gesamten data.frame auszuführen. Wenn Ihr data.frame mehr als zwei Spalten hat und Sie die Operation insbesondere auf zwei Spalten beschränken möchten, müssen Sie dieses Argument unterteilen. Entsprechend dem Code im OP, mit einem dat.frame namens df1, können Sie dieses durch rowSums(df1[c("A", "B")]) ersetzen, um das gewünschte Ergebnis zu erhalten.

Daten

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

Es gibt mir diesen Fehler:" Fehler in rowSums (dat): 'x' muss numerisch sein ' – dede

+0

Das bedeutet, dass mindestens eine Ihrer Spalten nicht numerisch ist und die Berechnung der Summe daher keinen Sinn ergibt. Es funktioniert an dem von Ihnen angegebenen Beispiel, das am Ende meiner Antwort eingelesen und zur Verfügung gestellt wurde (Löschen der dritten Spalte der erwarteten Ausgabe). – lmo

+0

Ja, eine der beiden Spalten ist numerisch, die andere eine ganze Zahl. – dede

Verwandte Themen