在单个数据集中合并多个不同的csv

时间:2016-01-21 10:00:14

标签: r merge

如何在单个数据集中合并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(&#34; 1983-01&#34;,&#34; 1983-02&#34;,&#34; 1983-03&#34;,:     参数意味着不同的行数:278,398

我有1253个csv文件。我想将这些文件设置为一个数据集。 每个文件的相同列名应该是相同的名称,而不是&#39; x.column&#39;像这样。我附上了样本结果文件。你可以很容易地理解我想做什么。我向您展示了2个示例文件,如下所示。 &#34; dput(mydata1 [1:2])&#34;编码数据如下。最终目标是将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", "location"), class = "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]

2 个答案:

答案 0 :(得分:1)

由于数据集共享相同的列,因此您可以将方法基于行绑定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

答案 1 :(得分: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