首页 > 解决方案 > 合并目录中的多个数据框

问题描述

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

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

我收到以下回复: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")

标签: r

解决方案


问题

问题不在于合并,而在于您有重复行名的一个或多个个体。csv本质上,如果您尝试对read.csv()包含重复行名的文件执行简单操作,您将得到这个确切的错误:

read.table 中的错误(file = file,header = header,sep = sep,quote = quote,:不允许重复的'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 要求其数据框的行名是唯一的。


推荐阅读