合并目录中的多个数据框

时间:2018-07-22 03:04:30

标签: r

我想在一个目录中合并多个数据框。其中一些数据框具有重复的行。所有数据框具有相同的列信息。

我在下面的site上找到了下面的代码,但是,我不知道如何修改它,以便重复的行不会引起错误。

我收到以下答复:Error in read.table(file = file, header = header, sep = sep, quote = quote, duplicate 'row.names' are not allowed

这是从单个目录中读取多个数据帧的代码。如何修改它来避免重复行问题?

multmerge = function(mypath){
  filenames=list.files(path=mypath, full.names=TRUE)
  datalist = lapply(filenames, function(x){read.csv(file=x,header=T)})
  Reduce(function(x,y) {merge(x,y)}, datalist)}

mymergeddata <- multmerge("/Users/Danielle/Desktop/Working 
Directory/Ecuador/datasets to merge")

1 个答案:

答案 0 :(得分:0)

问题

问题不在于合并,而在于一个或多个单独的csv 中,在这些地方您有重复的行名。本质上,如果您尝试对包含重复行名的文件进行简单的read.csv()处理,则会得到以下确切错误:

  

read.table中的错误(文件=文件,标头=标头,sep = sep,引号=   引号:不允许重复的“ row.names”

解决方案

那么您如何规避它?您可以修复单个csv,如果在该目录中有20个csv,则听起来可能更具挑战性。在这种情况下,我建议您做的是在读取过程中不要使用行名,如果确实需要,请在读取操作完成后设置行名。例如:

multmerge = function(mypath){
  filenames=list.files(path=mypath, full.names=TRUE)
  datalist = lapply(filenames, function(x){read.csv(file=x,header=T, row.names = NULL)})
  Reduce(function(x,y) {rbind(x,y)}, datalist)}

mymergeddata <- multmerge("~/Desktop")
mymergeddata[mymergeddata$Day.Index == "2014-01-07",]


          Day.Index Sessions year
1    2014-01-07       57 2014
1091 2014-01-07       57 2014

看到了吗? Day.Index中的两个完全相同的值,但是由于它们不是行名,因此不会出错。如果您更改了代码以使用第一列(Day.Index)作为行名(通过指定row.names=1),那么我将能够复制您的错误:

multmerge = function(mypath){
  filenames=list.files(path=mypath, full.names=TRUE)
  datalist = lapply(filenames, function(x){read.csv(file=x,header=T, row.names = 1)})
  Reduce(function(x,y) {rbind(x,y)}, datalist)}

mymergeddata <- multmerge("~/Desktop")
nrow(mymergeddata)

> Error in read.table(file = file, header = header, 
sep = sep, quote = quote, : duplicate 'row.names' are not allowed

优惠 我正在使用rbind()逐行追加,但是您可以将其替换为merge()就地,并且答案仍然是正确的。

本质上:R要求其数据帧的行名称是唯一的。