2015-05-05 12 views
5

Ho un data.frame che è 100x100 e ho bisogno di riassumerlo come una scala mobile. Iniziare con la prima voce della prima colonna e quindi continuare ad aggiungere la prima voce della seconda colonna alla seconda voce della prima e così via fino a quando l'ultima voce della somma è l'ultima riga dell'ultima colonna. Guardarlo come una matrice diagonale comesomma di righe indipendenti di un frame di dati in un modo crescente

d3 <- data.frame(a = c(rep(0.5,5),0,0), b = c(0,rep(0.3,5),0), e = c(0,0,rep(0.8,5))) 

potrebbe essere utile per capire il problema. Voglio sommare le righe di una matrice come d3.

Ho cercato di creare un piccolo esempio ma non sono stato in grado di creare un ciclo o una funzione che semplifica il lavoro.

devo questi dati:

d <- data.frame(a = rep(0.5,5), b = rep(0.3,5), e = rep(0.8,5)) 

e ho bisogno di un modo per creare un singolo vettore con le voci:

d2 <- rep(NA) 
d2[1] <- d$a[1] 
d2[2] <- sum(d$a[2],d$b[1]) 
d2[3] <- sum(d$a[3],d$b[2],d$e[1]) 
d2[4] <- sum(d$a[4],d$b[3],d$e[2]) 
d2[5] <- sum(d$a[5],d$b[4],d$e[3]) 
d2[6] <- sum(d$b[5],d$e[4]) 
d2[7] <- d$e[5] 

che è uguale a c(0.5, 0.8, 1.6, 1.6, 1.6, 1.1, 0.8).

vi ringrazio in anticipo per l'aiuto

+3

Meglio usare matrici, non data.frames. Puoi identificare la tua selezione di "scale mobili" di righe, 'esca', con una matrice 0/1 per moltiplicare contro' d', come 'd% *% esca'. – Frank

risposta

1

Si può provare:

rowSums(
    mapply(function(x,y) { 
     ret<-numeric(nrow(d)+ncol(d)-1) 
     ret[y:(y+length(x)-1)]<-x 
     ret},d,1:(length(d))) 
) 
+0

Grazie, sembra funzionare bene nella matrice 100x100 – ireinstein

2

Puoi provare

m1 <- as.matrix(d) 
unname(tapply(m1, col(m1)+row(m1), FUN=sum)) 
#[1] 0.5 0.8 1.6 1.6 1.6 1.1 0.8 
Problemi correlati