R 如何一次成对转换数据帧中的多个不同相关矩阵?

R 如何一次成对转换数据帧中的多个不同相关矩阵?,r,matrix,R,Matrix,我想同时将多重相关矩阵转换为数据帧 我的矩阵组如下所示: [ 我想要的输出如下所示: 我当前的代码如下: dat1 <- read.xlsx("correlation reshape.xlsx",sheet=1,rows=1:7,cols=2:8)#read studyid1-James2005 dat1 reshape_1<-as_cordf(dat1)#reshape the data into matrix reshape_1 long.format1<-reshape

我想同时将多重相关矩阵转换为数据帧

我的矩阵组如下所示: [

我想要的输出如下所示:

我当前的代码如下:

dat1 <- read.xlsx("correlation reshape.xlsx",sheet=1,rows=1:7,cols=2:8)#read studyid1-James2005
dat1
reshape_1<-as_cordf(dat1)#reshape the data into matrix
reshape_1
long.format1<-reshape_1 %>% gather(-rowname, key = "colname", value = "cor")#reshape the data into 
na1<-na.omit(long.format1)#omit NA value
## psychmeta
dat2 <- read.xlsx("correlation reshape.xlsx", sheet=1,rows=8:11,cols=2:5,skipEmptyCols=TRUE)#read studyid2-Ashforth2010
reshape_2<-as_cordf(dat2)
long.format2<-reshape_2 %>% gather(-rowname, key = "colname", value = "cor")
long.format2
na2<-na.omit(long.format2)
#output method1 
c <- rbind(na1,na2)#combine na1,na2..., and put them out.
write.table(c,"reshape_output.csv",sep=",")

dat1您可以使用
pivot\u longer
from
tidyr
来重塑您的数据: 首先,让我们定义两个相关数据帧(我使用了
mtcars
iris

df=mtcars[c(1:10),]
表1=cor(df)
ID=代表(“表1”,nrow(表1))
table1=data.frame(cbind(ID,行名(table1),table1))
在这里,您可以看到df1的结构:

>标题(表1[c(1:3),c(1:5)])
ID V2 mpg气缸显示
mpg表1 mpg 1-0.861416514957246-0.773986849952057
气缸表1气缸-0.861416514957246 1 0.888289505678108
显示表1显示-0.773986849952057 0.888289505678108 1
现在,我们正在定义一个表2

df2=iris[c(1:20),-5]
表2=cor(df2)
ID=代表(“表2”,nrow(表2))
table2=data.frame(cbind(ID,行名(table2),table2))
结构如下:

>表2
ID V2萼片。长萼片。宽花瓣。长花瓣。宽
萼片长度表2萼片长度1 0.875633706307696 0.316760894337443 0.561846414596048
萼片宽度表2萼片宽度0.875633706307696 1 0.260051160822913 0.753193903742604
花瓣长度表2花瓣长度0.316760894337443 0.260051160822913 1 0.368645505390148
花瓣宽度表2花瓣宽度0.561846414596048 0.753193903742604 0.368645505390148 1
现在,我们将使用
pivot\u longer
对它们进行重塑,我们将能够使用
rbind

库(dplyr)
图书馆(tidyr)
表2=表2%>%pivot\u更长(,cols=3:ncol(.),name\u to=“Rownames”,value\u to=“Correlation”)
表1=表1%>%pivot\u更长(,cols=3:ncol(.),name\u to=“Rownames”,values\u to=“Correlation”)
表_final=rbind(表1、表2)
这里是输出,您可以有:

>标题(最终表格)
#一个tibble:6x4
ID V2行名相关性
表1 mpg mpg 1
2表1 mpg气缸-0.861416514957246
表1 mpg显示-0.773986849952057
表1 mpg马力-0.893722265184114
表1 mpg阻力0.541358491575314
6表1 mpg重量-0.599189365369649
它回答了你的问题吗

编辑:使用
for
循环处理多个相关矩阵

根据我从您的问题和评论中了解到的情况,您在一个excel文件中有多个相关矩阵,每个矩阵都通过其
studyID
识别。我说的对吗

要处理所有这些文件,您可以像这样使用
for
循环(假设您的excel文件名为
test\u xl
):

库(openxlsx)
test=read.xlsx(“../test_xl.xlsx”)
uniqueID=unique(test$studyID)[!is.na(unique(test$studyID))]
表_final=NULL
用于(i/1:长度(唯一ID))
{
df=test[which(test$studyID==uniqueID[i]),]
df=df[colSums(!is.na(df))>0]
如果(i==1){colnames(df)=colnames(test)[1:ncol(df)]}
否则{
colnames(df)[3:ncol(df)]%pivot\u更长(,cols=3:ncol(df),names\u to='colnames',values\u to='correlation')
如果(i==1){table_final=df}
else{table_final=rbind(table_final,df)}
}

希望它能为您工作

非常感谢,我了解您的方法,您可以根据ID为两个不同的相关矩阵创建两个表,但是如果我有100多个或甚至1000多个ID,那么可能很难创建1000多个表然后合并,所以我想知道是否有其他方法可以做到这一点,比如一些if条件到judge?我创建的两个不同的相关矩阵仅用于示例。如果您有100或1000个不同的数据帧,则过程将是相同的(具有
pivot\u更长的部分
)。您只需将其集成到
for
循环中。这还取决于您开始使用的数据类型。是原始数据帧?还是矩阵关联?您的ID是如何定义的?这是矩阵关联,ID是基于不同研究的不同类型的关联,感谢您的帮助,我尝试找出答案it@keavy,所以,如果我好吧,你有一个excel文件,里面填充了多重相关矩阵,对吗?我编辑了我的代码,介绍了excel文件在loop@keavy,我为
循环代码更正了我的
中的一些错误,如果您想在数据集上测试它,您需要提供数据而不是图像