2017-06-05 62 views
1

我有2个的数据帧(DF 1和2)具有以下结构:创建从数据帧不同的矩阵,其中R为环

CHR SNP A1 A2 FAM CA1 CA2 
1 rs3818361 A G 0.35 7 13 
2 rs7561528 A G 0.2 4 16 
2 rs6733839 T C 0.45 9 11 
2 rs744373 G A 0.45 9 11 
2 rs35349669 T C 0.35 7 13 
... 

它们具有7列和41行数(不计数colnames行)。与列CA1和CA2我必须建立2×2矩阵的数据帧中的每一个的,像这样:

[CA1 from df1] [CA2 from df1] #first row CA1 and CA2 from df1 
[CA1 from df2] [CA2 from df2] #first row CA1 and CA2 from df2 

[CA1 from df1] [CA2 from df1] #second row CA1 and CA2 from df1 
[CA1 from df2] [CA2 from df2] #second row CA1 and CA2 from df2 

[CA1 from df1] [CA2 from df1] #third row CA1 and CA2 from df1 
[CA1 from df2] [CA2 from df2] #third row CA1 and CA2 from df2 

我考虑一个for循环(I在1:41),但我有麻烦来巩固这个想法。

for (i in 1:41) { 
do 
datai <- c(df1[i,7],df1[i,8],df2[i,7],df2[i,8]) 
matrixi <- matrix(datai, nrow=2, ncol=2, byrow=TRUE) 
} 

我想让循环生成41个矩阵。我在矩阵和数据(datai和matrixi)中的“i”意思是“我想要其中的41个”。有什么想法吗?

回答

1

我们可以使用Map

Map(rbind, split(df1[c('CA1', 'CA2')], 1:nrow(df1)), 
       split(df2[c('CA1', 'CA2')], 1:nrow(df2))) 
+1

它的工作原理,谢谢! :) – melunuge92

1
var <- c("CA1", "CA2") 
lapply(seq(nrow(df1)), function(x) rbind(df1[x,var], df2[x,var])) 
+0

也适用!谢谢:) – melunuge92

0

即使你的答案的工作,我也问有人在我的实验室的帮助,它的工作,有一个替代。在这里,我给你答案,以防止它可以帮助某人:

首先,将我需要的所有7个dfs的所有列都绑定到一个单一数据框中:称为“count”。在数量,结构是这样的:

counts<-cbind(df1$CA1,df1$CA2,df2$CA1,df2$CA2,df3$CA1,df3$CA2,df4$CA1,df4$CA2 
,df5$CA1,df5$CA2,df6$CA1,df5$CA2,df6$CA1,df6$CA2) 

所以,我想

res <- list() 

for (i in c(1,3,5,7,9,11,13)) { 
    for (k in c(3,5,7,9,11,13)) { 
    for (j in 1:41) { 
     tmp <- chisq.test(matrix(c(counts[j,i],counts[j,(i+1)],counts[j,k],counts[j,(k+1)]),nrow=2,ncol=2,byrow=TRUE)) 
     res<-c(res,as.list(c(tmp$p.value))) }}} 

(我想矩阵做CHISQ测试... that's为什么it's内的chisq.test(),但你可以在代码中看到答案)。

+0

关于我原来的问题,这部分是做的伎俩:矩阵(c(计数[j,7],计数[j,(8)],计数[j,7],计数[j,(8) ]),nrow = 2,NcoI位= 2,byrow = TRUE) – melunuge92