Найдите корреляцию между столбцами, имена которых указаны как значения в другом фрейме данных

У меня есть два фрейма данных, один из которых представляет собой список пар людей, аналогичный приведенному ниже (но примерно со 150 парами):

ID_1   ID_2
X14567  X26789
X12637 X34560
X67495 X59023

Другой фрейм данных состоит из одного столбца для каждого человека с числовыми значениями, относящимися к этим людям внизу. Всего сказано около 300 столбцов и 300 строк. Например:

X14567  X12637  X26789  X67495  X34560  X59023
0.41    0.29    0.70    0.83    0.41    0.30
0.59    0.44    0.20    0.94    0.03    0.97
0.48    0.91    0.78    0.92    0.40    0.09
0.07    0.21    0.42    0.14    0.96    0.96
0.33    0.13    0.53    0.04    0.52    0.49
0.94    0.28    0.37    0.26    0.11    0.09

Я хочу найти корреляцию этих значений между каждой парой людей. чтобы получилось что-то вроде:

ID_1       ID_2    Correlation
X14567     X26789      -0.25
X12637     X34560      -0.25
X67495     X59023      -0.11

Есть ли способ, которым я могу извлечь значения из первого фрейма данных, чтобы указать имена двух столбцов, между которыми мне нужно найти корреляции, таким образом, чтобы их можно было легко повторить для каждой строки первого фрейма данных?

Большое спасибо за вашу помощь


person Caragh    schedule 26.08.2016    source источник
comment
Разве это не было бы apply(df1, 2, function(x) cor( df2[[ x[1] ]], df2[[ x[2] ]] ) )?   -  person IRTFM    schedule 26.08.2016
comment
Если вам просто нужны корреляции между всеми столбцами во втором фрейме данных, вы можете сделать library(reshape2); melt(cor(df)).   -  person eipi10    schedule 26.08.2016


Ответы (2)


Если x и y - ваши два data.frames и имена столбцов установлены соответствующим образом, вы можете использовать apply.

apply(x, 1, function(row) cor(y[row[1]], y[row[2]]))

Оттуда просто добавьте значения в свой x data.frame:

x$cor <- apply(x, 1, function(row) cor(y[row[1]], y[row[2]]))


      V1     V2        cor
2 X14567 X26789 -0.2515737
3 X12637 X34560 -0.2563294
4 X67495 X59023 -0.1092830
person tcash21    schedule 26.08.2016

Если вам просто нужны корреляции между всеми столбцами во втором фрейме данных, вы можете сделать:

library(reshape2)

df.corr = melt(cor(df))

Чтобы удалить повторяющиеся столбцы (то есть корреляцию каждого столбца с самим собой):

df.corr = subset(df.corr, Var1 != Var2)

Пример использования встроенного фрейма данных mtcars:

mtcars.corr = melt(cor(mtcars))
    Var1 Var2       value
1    mpg  mpg  1.00000000
2    cyl  mpg -0.85216196
3   disp  mpg -0.84755138
...
119   am carb  0.05753435
120 gear carb  0.27407284
121 carb carb  1.00000000
person eipi10    schedule 26.08.2016