2011-05-12 164 views
0

我喜歡[] R: merge unequal dataframes and replace missing rows with 0R:循環合併dataframes和cbind這些

一個問題下面是該問題的數據:

df1 = data.frame(x=c('a', 'b', 'c', 'd', 'e')) 
df2 = data.frame(x=c('a', 'b', 'c'),y = c(0,1,0)) 
df3 = data.frame(x=c('a', 'b', 'c', 'd'),y = c(1,1,1,0)) 
df4 = data.frame(x=c('b', 'a', 'e'),y = c(0,1,0)) 
zz <- merge(df1, df2, all = TRUE) 
zz[is.na(zz)] <- 0 

在這個例子中我合併DF1 DF2與。現在我想創建一個循環來合併df3和df4以及更多的數據幀與df1。問題在於列表中的結果必須被綁定才能生成最終的數據框。

任何人都可以幫助我嗎?

謝謝!


編輯! 這是我創建的循環。變量goterms包含一個包含10個變量的列表。變量是interestedGO中列表的名稱。首先選擇interestGO,計算結果爲變量結果。這個結果必須與x合併。因爲它是一個循環,所有10個結果必須聯合起來才能創建最終的數據幀。

for (i in 1:length(goterms)){ 
    goilmn<-as.data.frame(interestedGO[i]) 
    resultILMN<-match(goilmn[,1], rownames(xx2),nomatch=0) 
    resultILMN[resultILMN] <- 1 
    result<-cbind(goilmn,resultILMN) 
    colnames(result) <- c('x','result') 

    zz<-merge(x, result, all=TRUE) 
    resultloop<-zz[is.na(zz)]<-0 
    standard[i]<-cbind(resultloop) 
} 

goterms: 
[1] "GO:0009611" "GO:0007596" "GO:0050817" "GO:0061082" "GO:0007599" 
[6] "GO:0050776" "GO:0006910" "GO:0034383" "GO:0019932" "GO:0002720" 

interestedGO: 
$`GO:0009611` 
[1] "ILMN_1651346" "ILMN_1651354" "ILMN_1651599" "ILMN_1651950" "ILMN_1652287" 
[6] "ILMN_1652445" "ILMN_1652693" "ILMN_1652825" "ILMN_1653324" "ILMN_1653395" 

$`GO:0007596` 
[1] "ILMN_1651599" "ILMN_1652693" "ILMN_1652825" "ILMN_1653324" "ILMN_1655595" 
[6] "ILMN_1656057" "ILMN_1659077" "ILMN_1659923" "ILMN_1659947" "ILMN_1662619" 
[11] "ILMN_1664565" "ILMN_1665132" "ILMN_1665859" "ILMN_1666175" "ILMN_1668052" 
[16] "ILMN_1670229" "ILMN_1670305" "ILMN_1670490" "ILMN_1670708" 
"ILMN_1671766"        

$`GO:0050817` 
[1] "ILMN_1651599" "ILMN_1652693" "ILMN_1652825" "ILMN_1653324" "ILMN_1655595" 
[6] "ILMN_1656057" "ILMN_1659077" "ILMN_1659923" "ILMN_1659947" "ILMN_1662619" 
[11] "ILMN_1664565" "ILMN_1665132" "ILMN_1665859" "ILMN_1666175" "ILMN_1668052" 
[16] "ILMN_1670229" "ILMN_1670305" "ILMN_1670490" "ILMN_1670708" "ILMN_1671766" 
[21] "ILMN_1671928" "ILMN_1675083" "ILMN_1678049" "ILMN_1678728" 
"ILMN_1680805"        

$`GO:0061082` 
[1] "ILMN_1661695" "ILMN_1665132" "ILMN_1716446" "ILMN_1737314" "ILMN_1772387" 
[6] "ILMN_1784863" "ILMN_1796094" "ILMN_1800317" "ILMN_1800512" "ILMN_1807074" 

x是所有ILMN代碼的參考。這是x變量的頭部。 X [1:100,]

[1] ILMN_1343291 ILMN_1343295 ILMN_1651228 ILMN_1651229 ILMN_1651238 
[6] ILMN_1651254 ILMN_1651259 ILMN_1651260 ILMN_1651262 ILMN_1651278 
[11] ILMN_1651282 ILMN_1651285 ILMN_1651286 ILMN_1651303 ILMN_1651310 
[16] ILMN_1651315 ILMN_1651330 ILMN_1651336 ILMN_1651343 ILMN_1651346 
[21] ILMN_1651347 ILMN_1651354 ILMN_1651358 ILMN_1651370 ILMN_1651373 
[26] ILMN_1651385 ILMN_1651396 ILMN_1651415 ILMN_1651428 ILMN_1651430 
[31] ILMN_1651433 ILMN_1651437 ILMN_1651438 ILMN_1651456 ILMN_1651457 
+0

cbind它們的代碼無法運行。什麼是'xx2'? – kohske 2011-05-12 08:45:50

回答

3

我不知道如果我沒有你想要什麼瞭解,但像他這樣?

> zz <- Reduce(function(a,b)merge(a,b,all=TRUE, by="x"), list(df1, df2, df3, df4)) 
> zz[is.na(zz)] <- 0 
> zz 
    x y.x y.y y 
1 a 0 1 1 
2 b 1 1 0 
3 c 0 1 0 
4 d 0 0 0 
5 e 0 0 0 

您可以通過使用Reduce避免循環,但請注意,它不一定會導致性能改進。

如果你想單獨dataframes,然後地圖(僅僅mapply的包裝)是有用的:

> zz <- Map(function(b)merge(df1,b,all=TRUE, by="x"), list(df2, df3, df4)) 
> zz 
[[1]] 
    x y 
1 a 0 
2 b 1 
3 c 0 
4 d NA 
5 e NA 

[[2]] 
    x y 
1 a 1 
2 b 1 
3 c 1 
4 d 0 
5 e NA 

[[3]] 
    x y 
1 a 1 
2 b 0 
3 c NA 
4 d NA 
5 e 0 

和do.call

> zz <- do.call("cbind", zz) 
> zz[is.na(zz)] <- 0 
> zz 
    x y x y x y 
1 a 0 a 1 a 1 
2 b 1 b 1 b 0 
3 c 0 c 1 c 0 
4 d 0 d 0 d 0 
5 e 0 e 0 e 0 
+0

嗨Kohske,我編輯我的問題。我希望現在清楚。謝謝 – Samantha 2011-05-12 08:00:52

+0

@Samantha我把一段代碼放在'cbind'列表中。可能最好是顯示輸入(即數據)和**期望輸出**的例子,以明確你的問題是什麼。 – kohske 2011-05-12 08:05:58

+0

你的第一個輸出zz是正確的,但代碼是在一個循環中,所以我的想法是,沒有辦法在循環中使用此代碼。 (zz < - Reduce(函數(a,b)合併(a,b,all = TRUE,by =「x」),list(df1,df2,df3,df4)))或者我錯了? – Samantha 2011-05-12 08:25:15