2013-05-02 73 views
2

我知道這個問題以前已經被問到過了,但是以前的帖子的答案似乎無法解決我的問題。合併R中不同行的多個文件

我有幾十個製表符分隔的.txt文件。每個文件都有兩列(「pos」,「score」)。我想將所有「分數」列編譯成一個具有多列的文件。每個文件中的行數有所不同,它們與編譯無關。

如果有人能指導我如何做到這一點,最好在R,這將是很多有用的。

或者,我的最終目標是從每個文件中讀取「分數」列的中位數和平均值。因此,如果這可以完成,無論是否編譯文件,這將是更有幫助。

謝謝。

UPDATE:

作爲吸引力,因爲個人代碼忍者的想法是,我明白這將不得不仍然是一個幻想。抱歉不明確。

我已經lapply嘗試和減少,例如,

> files <- dir(pattern="X.*\\.txt$") 
> File_list <- lapply(filesToProcess,function(score) 
+ read.table(score,header=TRUE,row.names=1)) 
> File_list <- lapply(files,function(z) z[c("pos","score")]) 
> out_file <- Reduce(function(x,y) {merge(x,y,by=c("pos"))},File_list) 

我知道沒有什麼意義,考慮到我有可變的行號。我也試過plyr

> files <- list.files() 
> out_list <- llply(files,read.table) 

以及cbind和rbind。通常我會收到錯誤消息,因爲行號不匹配,或者我只是將所有「分數」數據編譯到一列中。

對類似帖子的建議(例如,Merging multiple csv files in RSimultaneously merge multiple data.frames in a listMerge multiple files in a list with different number of rows)沒有幫助。

我希望這可以解決問題。

+2

斯蒂芬 - 你能不能請告訴我們你之前曾經嘗試過什麼,什麼不起作用?您的問題可以很容易地在R中解決,但正如所述,它非常含糊。 SO用戶不是您爲您編寫代碼的個人代碼忍者。 – 2013-05-02 18:23:46

+0

?合併。如何設置所有= FALSE(默認)不做你想要的? – 2013-05-02 19:03:40

+0

@Jake要合併這些文件,我必須逐一列出它們,這正是我試圖避免的。 – stephanhart 2013-05-02 19:13:02

回答

0

我想你想不服這樣的:

all_data = do.call(rbind, lapply(files, 
           function(f) { 
            cbind(read.csv(f), file_name=f) 
           })) 

然後你可以做你喜歡「用」類型的動作什麼的。此外,不要忘記調整各種read.csv選項,以滿足您的需求。

E.g.一旦你有以上,你可以做以下(以及更多):

library(data.table) 
dt = data.table(all_data) 

dt[, list(mean(score), median(score)), by = file_name] 

小記:你也可以使用data.tablefread,以代替read.table及其衍生物讀取文件,而且速度會更快,而我們在這個時候,請使用rbindlist而不是do.call(rbind,

+0

除了輸出三列:「pos」,「score」和「file_name」以外,這使得我成爲那裏的一部分,因此所有數據都在列中連續列出,而不是按每個文件分隔列。有什麼建議麼? – stephanhart 2013-05-02 20:06:23

1

這個問題可以分兩個步驟來解決:

步驟1.閱讀您的CSV文件中的數據轉換成數據幀的列表,其中files是文件名的載體。如果您需要爲read.csv添加額外參數,請添加它們,如下所示。詳情請參閱?lapply

list_of_dataframes <- lapply(files, read.csv, stringsAsFactors = FALSE) 

第2步:計算單元,每個數據幀:

means <- sapply(list_of_dataframes, function(df) mean(df$score)) 

當然,你總是可以做到在一個步驟是這樣的:

means <- sapply(files, function(filename) mean(read.csv(filename)$score)) 
+0

這樣做(加上標題= TRUE)。謝謝。 – stephanhart 2013-05-02 20:27:20

+1

很高興工作。請考慮接受這個答案,如果它解決了你的問題。 – 2013-05-02 21:25:32