不允许重复的“row.names”错误

zpjtge22  于 2023-03-05  发布在  其他
关注(0)|答案(8)|浏览(659)

我正在尝试加载一个csv文件,其中有14列如下:

StartDate, var1, var2, var3, ..., var14

当我发出以下命令时:

systems <- read.table("http://getfile.pl?test.csv", header = TRUE, sep = ",")

我收到一条错误消息。
重复的行.不允许有名称
在我看来,第一个列名是导致问题的原因。当我手动下载文件并从文件中删除StartDate名称时,R成功读取文件并将第一个列名替换为X。有人能告诉我这是怎么回事吗?该文件是一个(逗号分隔)csv文件。

dsekswqp

dsekswqp1#

然后告诉read.table not 使用row.names

systems <- read.table("http://getfile.pl?test.csv", 
                      header=TRUE, sep=",", row.names=NULL)

现在您的行将被简单地编号。
还可以查看read.csv,它是read.table的 Package 器,已经设置了sep=','header=TRUE参数,因此您的调用简化为

systems <- read.csv("http://getfile.pl?test.csv", row.names=NULL)
yhuiod9q

yhuiod9q2#

This related question指出了?read.table文档中解释您的问题的一部分:
如果有标题,并且第一行包含的字段比列数少一个,则输入中的第一列用作行名称。否则,如果缺少row.names,则对行进行编号。
您的标题行可能比文件的其余部分少1列,因此read.table假定第一列是row.names(必须是唯一的),而不是列(可以包含重复值)。您可以使用以下两种解决方案之一来解决此问题:
1.在源文件中标题行的前面或后面添加分隔符(即\t,),或者
1.删除数据中的任何尾随分隔符
具体选择取决于数据的结构。

测试.csv示例:

如果您的test.csv如下所示:

v1,v2,v3 
a1,a2,a3,
b1,b2,b3,

默认情况下,read.table将此文件解释为比数据少一个标题列,因为分隔符与不匹配。

v1,v2,v3   # 3 items!! (header row)
a1,a2,a3,  # 4 items
b1,b2,b3,  # 4 items

第一列中的值(没有标题)被解释为行名称:a1b1。如果此列包含重复值(这是完全可能的),则会得到duplicate 'row.names' are not allowed错误。
如果设置row.names = FALSE,则不会发生标题行移位,但标题和数据中的列数仍然不匹配,因为分隔符不匹配
以下是row.names = FALSE的解释方式:

v1,v2,v3   # 3 items!! (header row)
a1,a2,a3,  # 4 items
b1,b2,b3,  # 4 items

解决方案1在标题行中添加尾随分隔符:

v1,v2,v3,  # 4 items!!
a1,a2,a3,  # 4 items
b1,b2,b3,  # 4 items

或者,在标题行中添加前导分隔符:

,v1,v2,v3  # 4 items!!
a1,a2,a3,  # 4 items
b1,b2,b3,  # 4 items

解决方案2从非标题行中删除多余的尾随分隔符:

v1,v2,v3   # 3 items
a1,a2,a3   # 3 items!!
b1,b2,b3   # 3 items!!
sbdsn5lh

sbdsn5lh3#

在我的例子中,每行末尾都有一个逗号,去掉这个逗号就行了

q3qa4bjr

q3qa4bjr4#

我在打开一个CSV文件时遇到了这个错误,其中一个字段中嵌入了逗号。该字段用引号括起来,我剪切并粘贴了其中带有引号=""的read.table。一旦我删除了引号="",read.table的默认行为就会接管并解决这个问题。所以我从这个问题开始:

systems <- read.table("http://getfile.pl?test.csv", header=TRUE, sep=",", quote="")

改为:

systems <- read.table("http://getfile.pl?test.csv", header=TRUE, sep=",")
bxgwgixi

bxgwgixi5#

我使用了readrpackage中的read_csv
根据我的经验,如果缺少列名,read.csv函数中的参数row.names=NULL将导致文件阅读错误,即每一列都将被移位。
read_csv解决了这个问题。

kgqe7b3p

kgqe7b3p6#

出现此错误的另一个可能原因是重复了整行。如果是这种情况,则可以通过删除重复行来解决问题。

cgh8pdjw

cgh8pdjw7#

@adrianoesch在这里给出的答案(https://stackoverflow.com/a/22408965/2236315)应该会有所帮助(例如,解决了@Frank提出的“如果您知道一个解决方案,不需要您的评论中提到的笨拙的变通方法(移动列名,复制数据),那就太好了。”和“......需要复制数据”)。
注意,如果你在一些文本编辑器中打开,你应该看到标题字段的数量少于标题行下面的列数。在我的例子中,数据集有一个“,”在最后一个标题字段的末尾丢失。

798qvoo8

798qvoo88#

看起来这个问题可能有不止一个原因。当我遇到同样的错误时,下面两个步骤起作用了。
1.我将我的文件保存为MS-DOS csv。(早些时候,它被保存为csv,excel starter 2010)。在记事本++中打开csv。没有昏迷不一致(一致性如上所述@Brian)。
1.注意到我没有使用参数sep="",。我使用了它,它工作了(即使这是默认参数!)

相关问题