R - 错误:"duplicate 'row.names' are not allowed"



我知道这是一个反复出现的问题,所以我提前为交叉发布道歉。

我在读取模型输出.csv文件时遇到问题,该文件看起来或多或少如下所示(原始文件大约有 14,000 行,但列如下所示):

time    x     y       z          w      r         s         t
1980    1   0.8327  0.3402    0.2021    0       1.1729      0
1980    2   0.7886  0.3399    0.2019    0       2.3014      0
1980    3   0.7909  0.3396    0.2017    0       3.4319      0
1980    4   0.7846  0.3394    0.2016    0       4.5559      0
1980    5   0.8103  0.3392    0.2014    0       5.7053      0
1980    6   0.8207  0.339     0.2013    0       6.865       0
1980    7   0.8263  0.3388    0.2012    0       8.0301      0
1980    14  0.9112  10.3411   20.6821   3.1175  60.4644     3.1175
1980    15  0.9092  8.878     17.756    2.734   70.2517     5.8515
1980    16  0.9001  9.5232    19.0464   2.9655  80.6749     8.817
1980    17  1.0313  7.59      15.18     2.4332  89.2962     11.2502
1980    18  1.0333  6.8859    13.7718   2.266   97.2154     13.5162

对于命令:

read.csv("df", header = TRUE, sep = ",", blank.lines.skip = FALSE)

我收到以下错误消息:

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

根据我对类似问题的回答的理解,一个可能的问题可能是read.csv命令没有将最后一列中的零识别为值,因此程序读取它时好像第一行包含的字段比列数少一个,因此使用第一列作为行名。

但是,当我创建一个"假"表,在与上面示例中所示的相同位置使用实际的零、空白或"NA"时,程序可以毫不费力地识别它们并读取文件。

例如

df <- data.frame(x=c(1,2,3,3,3,4,5,2,2,6,7,3,8,9,10))
df$y <- c(4,8,9,1,1,5,8,8,3,2,0,9,4,4,7)
df$z <- c(" "," "," ",4,5,6,7,8,9,10,11,12,13,14,15)
OR:
df$z <- c(0,0,0,4,5,6,7,8,9,10,11,12,13,14,15)
OR:
df$z <- c("NA","NA","NA",4,5,6,7,8,9,10,11,12,13,14,15)

谁能告诉我为什么会这样?

我已经按照其他用户的建议解决了这个问题:

df <- read.csv("df.csv", header = TRUE, row.names = NULL)
colnames(df) <- c(colnames(df)[-1],NULL)
write.table(df, "df.csv", sep = ",", col.names = TRUE, row.names = FALSE)
And start working as normal from here.

它工作得很好,但我想知道是否有更直接的解决方案来解决这个问题,或者我是否缺少一些东西。

谢谢

这里有两种方法。

第一个使用外部包,data.table.函数fread通过警告完成工作。而且列名乱了,因为第一行的字段比其他行少,fread丢弃该行。

data.table::fread("test.csv", sep = ";")
#   V1 V2 V3
#1:  A  1  6
#2:  A  2  7
#3:  A  3  8
#4:  A  4  9
#5:  A  5 10

警告消息:
在 data.table::fread("test2.csv", sep = ";") :从第
2 行开始数据输入并丢弃第 1 行,因为它的项目
太少或太多,无法成为列名或数据:Col1;Col2

第二种方式更复杂。如果您不想加载额外的包,我编写了一个函数,该函数使用readLines读取带有列名的第一行,然后使用read.table读取文件的其余部分。

myread <- function(file, sep = ",", ...){
nm <- readLines(file, n = 1)
nm <- unlist(strsplit(nm, sep))
DF <- read.table(file, skip = 1, sep = sep, ...)
if(length(names(DF)) > length(nm)){
names(DF)[(length(names(DF)) - length(nm) + 1):length(names(DF))] <- nm
} else names(DF) <- nm
DF
}
myread("test.csv", sep = ";")
#  V1 Col1 Col2
#1  A    1    6
#2  A    2    7
#3  A    3    8
#4  A    4    9
#5  A    5   10

文件

以下是文件的内容。请注意,列分隔符是分号,在大多数欧洲大陆,我们使用逗号作为小数标记,因此 CSV 格式用分号分隔列。

Col1;Col2
A;1;6
A;2;7
A;3;8
A;4;9
A;5;10

read.csv的帮助页面:

如果有标题并且第一行包含的标题少一个 字段比列数,第一列在 输入用于行名。 否则,如果"row.names"是 缺少,则行已编号。

没有看到CSV很难分辨,但似乎它必须满足列出的条件(即,第一行中少了一个条目,可能是由于列名为空)。

我的"row.names"问题是我只是使用了错误的"sep">

相关内容

最新更新