2012-02-22 4 views
0

У меня есть корреляционная матрица (Corr) с именами факторов A, B, C, D, E (они заданы как имена col и имена ростов).получить элемент матрицы в R

Я хочу создать кадр данных в формате Factor1, Factor2, Corr, чтобы сохранить его в базе данных.

Я использую sqldf, чтобы получить все комбинации этих факторов, используя запрос ниже.

SELECT a.Factor as FactorA, 
     b.Factor as FactorB 
FROM Factors a cross JOIN Factors b 
WHERE a.Factor>b.Factor 

Так что у меня ровно 5C2 строк.

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

dataframe должен выглядеть

Коэффициент образования, FactorB, испр [Коэффициент образования, FactorB]

Я был бы очень признателен за любую помощь ..

+0

Я думаю, что я мог бы понять, но было бы намного легче сказать, если вы предоставите минимальный воспроизводимый пример. –

+0

Рядом с дубликатом http://stackoverflow.com/questions/6782070 и http://stackoverflow.com/questions/7074246. – Aaron

ответ

0
df <- expand.grid(colnames(Corr), rownames(Corr)) 
df$Corr <- apply(df, 1, function(x) Corr[ x[1], x[2] ]) 
Ltri <- lower.tri(Corr) 
df[ Ltri , ] # the lower triangular data 

# I used the longley dataset and the second example on the `cor` help page to test 
# (Corr <- cor(longley)) 

Как обычно случается, когда @ G.Grothendieck ответы вопрос, его ответ более привлекателен, чем мой. В этом случае он немного страдает от того, что ему необходимо восстановить числовой индекс из факторов. С другой стороны, я всегда немного беспокоюсь, когда я использую upper.tri или lower.tri, так как они также кажутся очень неинтуитивными, потому что они не возвращают элементы, пока вы не будете использовать их в качестве индексов с помощью «[». Либо один из нас мог бы использовать ряд (Corr)> col (Corr) с тем же эффектом, и это стало бы более ясным для моего мышления.

Альтернативный выбор:

df[ row(Corr) > col(Corr) , ] 
subset(as.data.frame.table(Corr), row(Corr) > col(Corr)) 
+0

Работает отлично. бесконечно благодарен!! – user1042267

2

1) Попробуйте это где Corr ваша корреляционная матрица, например, Corr <- cor(iris[-5]):

subset(as.data.frame.table(Corr), as.numeric(Var1) > as.numeric(Var2)) 

2) Если вы хотите использовать sqldf, попробуйте следующее:

library(sqldf) 
DF <- as.data.frame.table(Corr) 
sqldf("select * from DF where Var1 > Var2") 

EDIT: добавлено решение, в котором используется sqldf.

Смежные вопросы