получить элемент матрицы в R - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть корреляционная матрица (Corr) с именами факторов A, B, C, D, E (они задаются как имена столбцов и имена строк).

Я хочу создать фрейм данных в формате 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 строк.

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

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

FactorA, FactorB, Corr [FactorA, FactorB]

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

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

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")

РЕДАКТИРОВАТЬ: добавлено решение, где используется sqldf.

0 голосов
/ 23 февраля 2012
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 отвечает на вопрос, его ответ более привлекателен, чем мой.В этом случае IMO немного страдает от того, что ему нужно восстановить числовой индекс из факторов.С другой стороны, я всегда немного волнуюсь, когда использую upper.tri или lower.tri, так как они также кажутся очень неинтуитивными, потому что они не возвращают элементы, пока вы не используете их как индексы с "[".Любой из нас мог бы использовать row (Corr)> col (Corr) для того же эффекта, и это казалось бы более ясным для моего мышления.

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

df[ row(Corr) > col(Corr) , ]
subset(as.data.frame.table(Corr), row(Corr) > col(Corr))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...