2017-08-18 28 views
2

DatenDer Versuch, unterschiedliche Spalten Anzahl an gleichzeitig zu summieren

Betrachten Sie diese data.table haben oder Datenrahmen (i mit data.table gerade arbeite):

a <- c(1, 6.7, 7.0, 6.5, 7.0, 7.2, 4.2, 5, 6.6,6.7) 
b <- c(2,5.0, 3.5, 4.9, 7.8, 9.3, 8.0, 7.8, 8.0,10) 
c <- c(3, 7.0, 5.5, 7.2, 7.7, 7.2, 8.0, 7.6, 7,6.7) 
d <- c(4, 7.0, 7.0, 7.0, 6.9, 6.8, 9.0, 6.0, 6.6,6.7) 
df <- data.frame(rbind(a,b,c,d)) 

    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 
a 1 6.7 7.0 6.5 7.0 7.2 4.2 5.0 6.6 6.7 
b 2 5.0 3.5 4.9 7.8 9.3 8.0 7.8 8.0 10.0 
c 3 7.0 5.5 7.2 7.7 7.2 8.0 7.6 7.0 6.7 
d 4 7.0 7.0 7.0 6.9 6.8 9.0 6.0 6.6 6.7 

Problem

ich versuche, X3 und X4 für die erste Zeile, X3 und X4 und X5 für das zweite zusammenzufassen, etc ...

Was ich tat

Ich habe einen Vektor namens iter:

iter <- c(1,2,3,4) 

Und was ich tat, ist eine for-Schleife

for(i in 1:nrow(df)){ 
df$sum[i] <- sum(as.numeric(df[i,2:(2+iter[i])]),na.rm=T)} 

Kennen Sie einen Weg, es zu tun, ohne ein für Schleife?

Erwartete Ausgabe

output 
    13.7 #correspond to df[1,X3]+df[1,X4] 
    13.4 #correspond to df[2,X3]+df[2,X4]+df[2,X5] 
    27.4 #correspond to df[3,X3]+df[3,X4]+df[3,X5]+df[3,X6] 
    37.4 #correspond to df[4,X3]+df[4,X4]+df[4,X5]+df[4,X6]+df[4,X7] 

EDIT

iter <- c(1,2,3,4) 

hier völlig willkürlich ist, so brauche ich eine Lösung für jeden Wert von iter

+0

@lmo versucht nun bearbeitet i die Datenrahmen und die for-Schleife –

Antwort

3

können Sie Reduce mit accumulate verwenden = TRUE und dann die Werte extrahieren.

# initialize iter variable 
iter <- 1:4 

# calculate cumulative row sums, dropping initial list element 
vals <- Reduce("+", df[2:10], accumulate=TRUE)[-1] 

# pull out what you want with recursive indexing and sapply 
sapply(1:nrow(df), function(x) vals[[c(iter[x], x)]]) 
[1] 13.7 13.4 27.4 34.7 
+0

einzuschließen Ich habe meinen Beitrag bearbeitet Kannst du es mit dem neuen df probieren? –

+0

gleich hier, wenn ich mit iter summieren möchte <- c (2,5,4,3) scheint es nicht zu funktionieren –

+0

Ziemlich einfache Änderung, ich denke, solange Sie die kumulative Summe wollen. Ich tauschte 'c (x, x)' mit 'c (iter [x], x)' im rekursiven Index. – lmo

3

Elemente df Faktoren sind die kompliziert die Lösung ein wenig. Zuerst drehe ich die relevanten Spalten auf numerische Matrix.

Edit: mit aktualisierten Version von df ohne Faktoren

mat <- sapply(df[,-1], as.numeric) 
rowSums(mat*cbind(TRUE, lower.tri(mat[,-1], diag = TRUE))) 

[1] 13.7 13.4 27.4 34.7 

beliebigen iter Verwendung:

index.mat = t(sapply(iter, function(x){rep(c(TRUE,FALSE), times = c(x+1, ncol(df)-x))})) 
rowSums(df[,-1]*index.mat) 

20.2 38.5 34.6 27.9 
+0

Ich bearbeitet meinen Beitrag können Sie versuchen, mit dem neuen df? –

+0

Woops, noch eine Sache, die Diagonale hier war willkürlich, wenn ich mit 'iter <- c (2,5,4,3) summieren möchte, scheint es nicht zu funktionieren –

+0

Ich aktualisierte meine Antwort um' iter' – Ape

1

Was ist damit? Wenn iter die Anzahl der Spalten angibt:

iter <- c(2,5,4,2) 
    sapply(1: length(iter),(function(i){ 
    ri <- iter[i] 
     sum(df[i, 3:(3+ri-1)]) 
    })) 

Wenn Sie es für die Reihenfolge der Zeilen verwenden (wie zum Neuordnen der Zeilen in dem Datenrahmen)

iter <- c(1,2,3,4) 
sapply(1: length(iter),(function(i){ 
    ri <- iter[i] 
    sum(df[ri, 3:(3+i)]) 
})) 
Verwandte Themen