Корреляция между двумя кадрами данных по строкам - PullRequest
14 голосов
/ 04 февраля 2012

У меня есть 2 кадра данных с 5 столбцами и 100 строками в каждом.

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
...

Я хотел бы получить корреляцию соответствующих строк, в основном

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

но без использования цикла for. Я предполагаю, что есть какой-то способ использовать plyr, но, похоже, не могу понять это правильно. Есть предложения?

Ответы [ 2 ]

22 голосов
/ 04 февраля 2012

В зависимости от того, хотите ли вы классное или быстрое решение, вы можете использовать либо

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

, что круто, но расточительно (потому что на самом деле вычисляет корреляции между всеми строками, которые вам на самом деле не нужны, поэтому они будут отброшены) или

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

, который делает только то, что вы хотите, но немного больше, чтобы напечатать.

5 голосов
/ 08 июня 2014

Я обнаружил, что as.matrix не требуется.

Корреляции всех пар строк между фреймами данных df1 и df2:

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

и столбцы:

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