R - 错误:“不允许重复'row.names'”

时间:2018-03-20 21:32:40

标签: 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”位于上面示例中所示的相同位置时,程序可以轻松识别它们并读取文件。

e.g。

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.

它工作正常,但我想知道是否有更直接的解决方案来解决这个问题,或者是否有我遗漏的东西。

谢谢,

2 个答案:

答案 0 :(得分:2)

这有两种方法。

第一个使用外部包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(&#34; test2.csv&#34;,sep =&#34;;&#34;)中:
  在第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

答案 1 :(得分:0)

来自read.csv的帮助页面:

  

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

在没有看到CSV的情况下很难说,但似乎它必须符合列出的条件(即第一行中的条目少一个,可能是由于列名称为空)。