2017-06-05 76 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