我想在一个目录中合并多个数据框。其中一些数据框具有重复的行。所有数据框具有相同的列信息。
我在下面的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")
答案 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要求其数据帧的行名称是唯一的。