我有一个相关矩阵(Corr),其因子名称为A,B,C,D,E(它们被设置为列名和rownames)。
我想以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函数,因为我想避免迭代。
数据框应该看起来像
FactorA,FactorB,科尔[FactorA,FactorB]
我真的很感激任何帮助......
答案 0 :(得分: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")
编辑:添加了使用sqldf的解决方案。
答案 1 :(得分: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回答问题时,他的回答比我的回答更有吸引力。在这种情况下,由于需要从因子中恢复数字索引,因此它会受到一点IMO的影响。另一方面,当我使用upper.tri
或lower.tri
时,我总是担心,因为它们看起来也非常不直观,因为它们不会返回元素,直到您将它们用作带有“[”的索引。我们中的任何一个人都可以使用行(Corr)&gt; col(Corr)达到同样的效果,我的思维方式会更清晰。
替代选择:
df[ row(Corr) > col(Corr) , ]
subset(as.data.frame.table(Corr), row(Corr) > col(Corr))