2015-12-14 63 views
0

此問題是this one的後續行爲,得到否定答覆並且沒有答案。所以,我試圖做到這一點使用R.根據一列將多個雙列文本文件合併到一個數據框中

我有很多(超過30)的文件是這樣的:

  • 文件1

    5 A1 
    23 A3 
    1 B2 
    289 BX5 
    90 D3 
    
  • 文件2

    2 A1 
    10 A2 
    3 B1 
    1 BX4 
    90 D3 
    24 E0 
    
  • 文件3

    4 A0 
    11 A2 
    1 B1 
    2 D3 
    

,我想結合所有的人都產生這樣的數據幀:基於this

A0 0 0 4 
A1 5 2 0 
A2 0 10 11 
A3 23 0 0 
B1 0 3 1 
B2 1 0 0 
BX4 0 1 0 
BX5 289 0 0 
D3 90 90 2 
E0 0 24 0 

,我試圖函數read.table使用兩個文件,同時指定第二列讀作爲行名稱,然後我通過合併行名的數據幀,這樣的:

> df1 <- read.table("File1", row.names = 2) 
> df1 
    V1 
A1 5 
A3 23 
B2 1 
BX5 289 
D3 90 
> df2 <- read.table("File2", row.names = 2) 
> df2 
    V1 
A1 2 
A2 10 
B1 3 
BX4 1 
D3 90 
E0 24 
> m1 <- merge(df1, df2, by=0, all=TRUE) 
> m1[is.na(m1)] <- 0 
> m1 
    Row.names V1.x V1.y 
1   A1 5 2 
2   A2 0 10 
3   A3 23 0 
4   B1 0 3 
5   B2 1 0 
6   BX4 0 1 
7   BX5 289 0 
8   D3 90 90 
9   E0 0 24 

到目前爲止好,但是當我試圖合併所產生的數據幀到第三個,這是行不通的如我希望。因此,我不確定我將如何繼續將所有30個文件合併到一個數據框中。以前我以爲我會修改描述heremultmerge功能,但現在我卡住了。

那麼,有沒有人請幫助我呢?提前致謝。

編輯:我也很感激,如果有人可以建議我一個更好的標題這個問題。

+0

由於此問題被標記爲重複(「之前已被詢問並且已經有答案」),標記該問題的人員可以向我指出問題的位置嗎?我無法在Stackoverflow中找到它;或者我只是沒有足夠努力搜索? [這個問題](http://stackoverflow.com/questions/22617593/merge-multiple-data-frames-by-row-names)對我來說是不同於我的,我看不到我的問題的任何答案。 – sentausa

回答

0

我試着從multmerge函數中爲你的問題修改Reduce-part。

#read in the data (can be replaced with filenames 
#like f1 <- read.table(file, header=F) 
#or even lapply(list.files(mypath), read.table, header=F) 
#to get all dataframes in a list 
f1 <- read.table(text="5 A1 
23 A3 
1 B2 
289 BX5 
90 D3", header=F) 

f2 <- read.table(text="2 A1 
10 A2 
3 B1 
1 BX4 
90 D3 
24 E0", header=F) 

f3 <- read.table(text="4 A0 
11 A2 
1 B1 
2 D3", header=F) 

#put files in list 
myfiles <- list(f1,f2,f3) 

#changing colnames because I like keeping my data in order/knowing where it came from. 
myfiles <- lapply(1:length(myfiles),function(x){ 
    r <- myfiles[[x]] 
    colnames(r) <- c(paste0("f",x),"ID") 
    r 
}) 

#using the Reduce-function 
res <- Reduce(function(x,y) {merge(x,y,all=T, by="ID")}, myfiles) 
res[is.na(res)]<-0 
res 

> res 
    ID f1 f2 f3 
1 A1 5 2 0 
2 A3 23 0 0 
3 B2 1 0 0 
4 BX5 289 0 0 
5 D3 90 90 2 
6 A2 0 10 11 
7 B1 0 3 1 
8 BX4 0 1 0 
9 E0 0 24 0 
10 A0 0 0 4 
+0

謝謝!它以我想要的方式工作。所以,似乎我從一開始就使用按行合併是錯誤的,而它應該是按列合併的,對吧? – sentausa

+0

根據您提供的輸入和輸出,您按欄合併。 – Heroka

0

下面介紹如何使用dplyr來做到這一點。首先,您需要加載數據而不分配行名稱。下面,我重用您的file1,file2,file3結構,但您也可以像使用df1,df2,df3那樣以正確的格式讀取它們。你需要一個姓名列加入。然後你連續兩次做full_join。然後我對數據進行排序,並更改來港爲0

file1 <-data.frame(Names=rownames(file1),V1=file1,row.names = NULL) 
file2 <-data.frame(Names=rownames(file2),V1=file2,row.names = NULL) 
file3 <-data.frame(Names=rownames(file3),V1=file3,row.names = NULL) 

library(dplyr) 
out <-file1 %>% 
full_join(file2,by = "Names") %>% 
full_join(file3,by = "Names") %>% 
arrange(Names) 
out[is.na(out)]<-0 
#> out 
# Names V1.x V1.y V1 
#1  A0 0 0 4 
#2  A1 5 2 0 
#3  A2 0 10 11 
#4  A3 23 0 0 
#5  B1 0 3 1 
#6  B2 1 0 0 
#7 BX4 0 1 0 
#8 BX5 289 0 0 
#9  D3 90 90 2 
#10 E0 0 24 0 

更新

要處理文件的任意數量的,我們就來介紹一個循環。

myfiles <- list(file1,file2,file3) 
out <-file1      #first file 
for (i in myfiles[-1]){   #all but first file 
out <-full_join(out,i,by = "Names") 
} 
out <-arrange(out,Names) 
out[is.na(out)]<-0 
out 
> out 
    Names V1.x V1.y V1 
1  A0 0 0 4 
2  A1 5 2 0 
3  A2 0 10 11 
4  A3 23 0 0 
5  B1 0 3 1 
6  B2 1 0 0 
7 BX4 0 1 0 
8 BX5 289 0 0 
9  D3 90 90 2 
10 E0 0 24 0 
+0

感謝您的回答。這是什麼'%>%'?我無法通過谷歌搜索找到它。以及如何爲超過3個文件做到這一點?我們不需要多次輸入full_join,對吧? – sentausa

+0

你會如何概括這個任意數量的文件? – Heroka

+0

@sentausa'%>%'是'magrittr'包中的前向管道運算符。 'dplyr'導入這個包。 –

相關問題