在R中读取具有重复行名称的CSV文件

24

我正在尝试读取一份有重复行名的csv文件,但是无法成功。我收到的错误信息是:Error in read.table(file = file, header = header, sep = sep, quote = quote, : duplicate 'row.names' are not allowed.

我使用的代码是:

S1N657 <- read.csv("S1N657.csv",header=T,fill=T,col.names=c("dam","anim","temp"))

以下是我的数据示例:
did <- c("1N657","1N657","1N657","1N657","1N657","1N657","1N657","1N657","1N657","1N657")
aid <- c(101,102,103,104,105,106,107,108,109,110)
temp <- c(36,38,37,39,35,37,36,34,39,38)

data <- cbind(did,aid,temp)

非常感谢您的帮助。


这个回答解决了你的问题吗?重复的'row.names'不允许错误 - Brian D
7个回答

34

该函数发现有重复的行名称,因此需要处理。可能最简单的方法是使用row.names=NULL,这将强制进行行编号--换句话说,它将您的第一列视为第一维而不是行号,因此添加行号(连续整数从“1”开始)。

read.csv("S1N657.csv", header=T,fill=T, col.names=c("dam","anim","temp"), row.names=NULL)

太对了,道格!我看到它已经像你说的那样将我的第一列(DAM ID)作为第一维来处理了。我排除了[, -1]这一部分,然后重新命名我的列以处理多余添加的那个。非常感谢! - baz
2
@Bazon,你的表头第一列没有名称。如果你给它一个名称,问题就会自动解决。 - VitoshKa
嗨道格,脚本中不应该在row.names=NULL之前加上逗号吗?这样脚本就应该是:read.csv("S1N657.csv", header=T,fill=T, col.names=c("dam","anim","temp"), row.names=NULL。 - baz
是的,谢谢——这是一个打字错误,我刚刚编辑添加了最后两个参数之间的逗号。 - doug
1
row.names=NULL并不能真正解决问题,它只是掩盖了问题。请建议检查标题数是否与值数匹配。 - Travis Heeter

3

试试这个:

S1N657 <- read.csv("S1N657.csv",header=T,fill=T,col.names=c("dam","anim","temp"), 
          row.names = NULL)[,-1]

1
嗨kohske,那个有效。你能解释一下代码的最后一部分:[,-1]吗?非常感谢! - baz
嗨kohske,运行脚本后,我发现脚本中的[,-1]部分删除了行名称或我的DAM ID(DID)。 - baz
是的,你说得对。如果你需要第一列(可能是每行重复的名称),请从上面的代码中删除[,-1]。 - kohske
koshke,我从脚本中排除了[-1,]部分,因为我仍然需要我的第一列(大坝ID),并重命名列以处理创建的额外列。非常感谢! - baz
我认为最好使用 header = TRUE 而不是直接删除第一行。 - Léo Léopold Hertz 준영

2
我最近遇到的问题是标题行中的列数与数据本身中的列数不匹配。例如,我的数据是制表符分隔的,所有数据行都有一个尾随制表符。手动添加的标题行没有。
我希望行可以自动编号,但实际上它将我的第一行视为行名。从文档中可以看出(由我强调):
row.names-行名称的向量。这可以是给出实际行名称的向量,也可以是给出包含行名称的表格列的列号的单个数字,或者是给出包含行名称的表格列的名称的字符字符串。
如果存在标题并且第一行包含比列数少一个字段,则输入中的第一列用于行名称。否则,如果缺少row.names,则对行进行编号。
使用row.names = NULL强制进行行编号。缺少或NULL row.names生成被认为是“自动”的行名称(不被as.matrix保留)。
通过在标题行中添加一个额外的制表符,使标题行具有与数据行相同的列数,从而解决了该问题。

2

猜测您的csv文件是从xlsx转换而来的。在第一行末尾添加逗号,删除最后一行,完成。


1
你的回答似乎没有解决所提出的问题,而且质量较低。请考虑更详细地阐述一下。 - avalancha
1
这实际上很有帮助...正如Travis Heeter所解释的那样,这可能是由于标题中缺少列。如果是这种情况,解决方法是在文本编辑器中打开文件,在第一行末尾添加逗号并保存。之后应该就可以找到它了。 - George Liu

1
我曾经遇到一个小CSV文件的问题,出现了“不允许重复的'row.names'”错误。问题在于,在我想要的14x14图表区域之外,有一个带有空格/其他数据的随机单元格。
当我运行“row.names = NULL”时,发现我的表格下面有多行空白数据(因此多个重复的行名称都是“空白”),找到了答案。
解决方案是删除表格区域外的所有行/列,然后问题得到解决!

1
简而言之,检查你的列名。如果你的第一行是列名,那么可能会缺少一个或多个列名。
例如:
"a","b","c"
a,b,c,d
a,b,c,d

上面的例子会导致一个row.name错误,因为每一行都有4个值,但只有3列被命名。
当我从在线资源构建csv时,这种情况发生过。

0

在我的情况下,问题来自于Excel文件。虽然它看起来完美无缺,但是它没有工作,我一直收到以下消息:Error in read.table(file = file, header = header, sep = sep, quote = quote, : duplicate 'row.names' are not allowed.

我尝试将我的Excel矩阵复制粘贴到一个新的空Excel表中,并重新尝试读取它:它成功了!不再有错误消息了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接