2012-02-03 21 views
10

Ho 2 frame di dati con 5 colonne e 100 righe ciascuno.Correlazione R tra 2 frame di dati per riga

id  price1  price2  price3  price4  price5 
1   11.22  25.33  66.47  53.76  77.42 
2   33.56  33.77  44.77  34.55  57.42 
... 

desidero ottenere la correlazione delle righe corrispondenti, fondamentalmente

for(i in 1:100){  
cor(df1[i, 1:5], df2[i, 1:5])  
} 

ma senza utilizzare un ciclo for. Presumo che ci sia in qualche modo l'uso di plyr per farlo ma non riesco a farlo bene. Eventuali suggerimenti?

risposta

20

A seconda se si desidera una soluzione fresca o veloce è possibile utilizzare

diag(cor(t(df1), t(df2))) 

che è fresco, ma uno spreco (perché calcola in realtà correlazioni tra tutte le righe che non si ha realmente bisogno in modo da saranno scartati) o

A <- as.matrix(df1) 
B <- as.matrix(df2) 
sapply(seq.int(dim(A)[1]), function(i) cor(A[i,], B[i,])) 

che fa solo quello che vuoi ma è un po 'più da digitare.

+1

+1 Tale primo è fresco. Inoltre, 't (as.matrix (df1))' può diventare 't (df1)', ecc., Poiché la coercizione alla matrice avviene implicitamente quando 't()' viene passato a data.frame. –

+0

Ah, bene, grazie (questo è il punto in cui il mio pensiero di basso livello mi prende;)), modifico quello –

+0

Che l'ha fatto. Grazie mille. – screechOwl

4

Ho trovato che non è necessario as.matrix.

correlazioni di tutte le coppie di righe tra dataframes df1 e df2:

sapply(1:nrow(df1), function(i) cor(df1[i,], df2[i,])) 

e colonne:

sapply(1:ncol(df1), function(i) cor(df1[,i], df2[,i])) 
Problemi correlati