2016-01-21 778 views
0

如何合併1個數據集中的100個csv文件?行和列號是不同的。如何在R中的1個數據集中合併100個csv文件?行和列號不同

我有很多csv文件。每個文件都有不同的列和行。 我嘗試了很多方法來合併,但我失敗了,如下所示。 你能給我一些建議嗎?

第一次嘗試。

files=list.files(pattern=".csv$") 
files 
mydata1=lapply(files, function(x) read.csv(x, stringsAsFactors = FALSE)) 

mydata2 <- function(x) { 

x.diff <- setdiff(colnames(x), colnames(y)) 
y.diff <- setdiff(colnames(y), colnames(x)) 

x[, c(as.character(y.diff))] <- NA 

y[, c(as.character(x.diff))] <- NA 

return(mydata2) 
} 

merdata= merge(lapply(files, function(x) read.csv(x, stringsAsFactors = FALSE)), files, by=c("location","yearmon", "MME"), all=T) 

#錯誤data.frame(列表(yearmon = C( 「1983至1901年」, 「1983年至1902年」, 「1983年至1903年」,: 參數意味着不同的行數:278 ,398

我有1253個CSV文件。我想使這些文件到一個數據集。 同一列的每個文件的名稱應該是相同的名稱,而不是「x.column」這樣的我附上樣本結果文件,你可以很容易地理解我想要做什麼,我向你展示2個示例文件如下所示。 「dput(mydata1 [1:2])」編碼數據如下。最終目標是將1253個文件合併到一個數據集中。 非常感謝您的幫助。

.Names = C( 「yearmon」, 「E01」, 「E02」, 「E03」, 「E04」, 「E05」, 「E06」, 「E07」, 「E08」,「 E09,E10,E11,E12,E13,E14, ,E15,E16,E17,E18,E19,E20,MME 」, 「位置」),類= 「data.frame」,row.names = C(NA, -398L)),

.Names = C( 「yearmon」, 「E01」, 「E02」 ,「E03」,「E04」,「E05」,「E06」,「E07」,「E08」,「E09」,「E10」, 「MME」,「location」),class =「data.frame」 ,row.names = c(NA,-278L )))

Sample Result iefile_1 [iefile_2]

+0

保留所有CSV文件作爲列表 - 你的代碼lapply部分的輸出,然後使用一個循環合併。 – zx8754

+1

也許合併不是你真正需要的。如果成功結束,它將產生帶有數千列的結果'data.frame',這對工作根本不方便。此外,我懷疑它會在這裏工作 - 你的data.frame具有包含不同數字(不共同)和merge的共同列(例如'E01'和'E02'),其實際上是'INNER JOIN '會產生空的結果表。我建議你先將'mydata1'中的表格重新整理成5列視圖(從'tidyr'包中查看函數'gather'),然後用'dplyr'中的'bind_rows'將它們綁定在一起。 – inscaven

+0

感謝您的回覆。其實,我剛開始在這一天學習R,我可能需要學習很多東西。在這個時候,由於我的理解不夠,我無法聽從你的建議。對於那個很抱歉。如果你不介意,你可以試試怎麼做?讓我給你數據文件。謝謝。 –

回答

0

嘗試是這樣的:

install.packages(c("dplyr", "tidyr"), dependencies = T) 
require("dplyr") 
require("tidyr") 

files <- list.files(pattern=".csv$") 
mydata1 <- lapply(files, function(x) read.csv(x, stringsAsFactors = FALSE)) 

mydata2 <- lapply(mydata1, function(df) { 
    df %>% gather(e_num, e_value, -yearmon, -MME, -location) 
}) %>% bind_rows 
+0

非常感謝。你給了我很大的幫助。 –

0

由於數據集中共享同一列,您可以立足於排綁定rbind()你的方法。 rbind()是一種按行組合向量,矩陣或數據幀的函數。你應該創建一個你的數據集的列表並用它們提供這個功能。

rbind(dt1,dt2,.., dtn) 

dt1.csv: 

Lett Color Num 
A  w  0.4 
A  b  -0.6 
B  b  1.2 
C  w  -0.70 

dt2.csv: 

Lett Color Num 
D  w  2.89 
D  b  0.06 
D  b  0.62 
D  w  0.5 
D  w  9.3 
B  w  -2.3 
A  b  -0.1 

讀取從文件中的數據:

> dt1 <- read.csv("dt1.csv", header=T, sep=",") 
> dt2 <- read.csv("dt2.csv", header=T, sep=",") 

> dt_merged <- rbind(dt1, dt2) 
> dt_merged 

Lett Color Num 
A  w  0.4 
A  b  -0.6 
B  b  1.2 
C  w  -0.70 
D  w  2.89 
D  b  0.06 
D  b  0.62 
D  w  0.5 
D  w  9.3 
B  w  -2.3 
A  b  -0.1 
相關問題