r - R-错误: “duplicate ' row.names' are not allowed”

标签 r error-handling read.csv

我知道这是一个经常性的问题,因此我提前为交叉发布道歉。

我在读取模型输出.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

Warning message:
In data.table::fread("test2.csv", sep = ";") :
Starting data input on line 2 and discarding line 1 because it has too
few or too many items to be column names or data: 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

关于r - R-错误: “duplicate ' row.names' are not allowed”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49394465/

相关文章:

matlab - 在Matlab中使用递归算法获得更多详细错误消息吗?

r - 导出时,如何用单个空格替换read.csv()生成的列名中的 “.”?

使用 UTF-8 编码的 read.csv()

r - 无需专用端点的安全 ACI - 使用水管工和 R 的 docker 镜像

r - 填充R渐变曲线

R markdown,隐藏库输出

r - 在函数中使用带有 read.csv 的粘贴

c++ - R 调用 Cpp 代码 : global variables not re-initialized

error-handling - 使用Global.aspx页面进行错误报告

java - 找不到路径?