2012-01-27 9 views
6

Ho due tabelle e sto cercando di cercare i valori da uno per aggiungere valori nell'altro. Attualmente sto usando due loop per ma funzionano lentamente. Sono nuovo di R e so che dovrei evitare il loop per accelerare le cose, ma non riesco a capire come.Ricerca senza looping

Tabella1 (diverse migliaia di righe, 37 colonne):

type cat1 cat2 cat3 ... cat36 
    1 2 3 2   7 
    3 6 2 1   9 
    2 4 6 7   4 
    3 5 7 8   2 
    5 2 2 9   1 
    4 3 1 2   3 
    1 8 1 4   4 
...

Table2 (36 righe, 5 colonne):

  type1 type2 type3 type4 type5 
cat1  2  3  4  3  8 
cat2  8  5  5  2  6 
cat3  7  5  1  3  5 
... 
cat36  4  7  2  8  9

voglio modificare ciascun valore in Table1 aggiungendo il valore appropriato (abbinamento tra 5 tipi e 36 categorie) da Tabella2. Ecco i risultati desiderati:

type cat1 cat2 cat3 ... cat36 
    1 4 11 9  11 
    3 10 7 2  11 
    2 7 11 12  11 
    3 9 12 9   4 
    5 10 8 14  10 
    4 6 3 5  11 
    1 10 9 11   8 
...

ecco mio attuale codice (lenta):

for (i in 1:36) { 
    for (j in 1:nrow(Table1)) { 
     Table1[j,i+1] = Table1[j,i+1] + Table2[i,Table1[j,1]] 
    } 
} 
+1

Sebbene abbia usato due anelli per chiarezza, io notare che ho potuto appena avuto un cappio attraverso le file di Tabella 1, aggiungendo la colonna appropriata Table2 a ogni riga Table1 . –

risposta

4

La colonna tipo in Tabella 1 indica quale colonnain Tabella 2 per aggiungere ai righe in Table1 . Quindi utilizzare la colonna "tipo" come indice per le righe Table2, e poi trasporre la matrice risultante in modo da poter aggiungere righe alle righe:.

Table3 <- cbind(Table1[ , "type"], 
       t(Table2[ , Table1[ , "type"] ]) + Table1[ , -1]) 

(sto supponendo che Table1 e Table2 sono matrici Se si tratta di frame di dati che è possibile utilizzare Table1$type anziché Table1[,"type"]).

+0

Grazie. Ho fatto in modo che funzionasse dopo aver corretto un refuso. Invece di 'Table2 [Table1 [," type "],]' dovrebbe essere 'Table2 [, Table1 [," type "]]' –

+0

Oops, hai ragione. Mi sono confuso trasporre tra righe e colonne! – Tyler

1

Vorrei trasformare entrambe le tabelle in "long" anziché in due formati "wide" differenti. Dopo aver effettuato entrambe le tabelle, è possibile eseguire un'unione (R data.frame analogico a un join SQL) sulle due tabelle e quindi sommariamente sommare i valori.

Ecco un esempio simile:

## creating some synthetic data 
df1 <- data.frame(type=sample(1:4, 100, replace=TRUE), cat1=sample(1:4, 100, replace=TRUE), cat2=sample(1:4, 100, replace=TRUE),cat3=sample(1:4, 100, replace=TRUE),cat4=sample(1:4, 100, replace=TRUE)) 
df2 <- data.frame(cat=1:4, type1=sample(1:4,4), type2=sample(1:4,4), type3=sample(1:4,4), type4=sample(1:4,4)) 

require(reshape) 

## rearrange df1 
m1 <- melt(df1, id.vars="type") 
m1$cat <- substr(m1$variable, 4,4) 
m1$variable <- NULL 

## rearrange df2 
m2 <- melt(df2, id.vars="cat") 
m2$type <- substr(m2$variable, 5, 5) 
m2$value2 <- m2$value 
m2$variable <- NULL 
m2$value <- NULL 

## now that they are laid out the same, they can be merged 
df3 <- merge(m1, m2) 
df3$newSum <- df3$value + df3$value2