【问题标题】:How to omit semicolon that ends each row in csv file when importing (read.csv) into R?将(read.csv)导入R时,如何省略结束csv文件中每一行的分号?
【发布时间】:2016-02-28 07:42:16
【问题描述】:

我想使用 read.csv 函数将 csv 文件导入 R。 总是会出现错误,我认为这是由于csv文件中的每一行数据也以分号结尾,而标题行没有那个分号。

header1;header2;header3     # here, there's no semicolon at the end of the line
cell1;cell2;cell3;          # here, there are semicolons! 
cell4;cell5;cell6;          # I think those are causing the issue

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

我正在处理大量 csv 文件,因此我希望有一种方法可以忽略数据行中的最后一个分号,因为我想使用第一行作为名称。

我使用的代码是:

df <- read.csv("test.csv", sep = ";", dec = ".", header = TRUE)

【问题讨论】:

  • 使用 header=FALSE 并使用 skip 参数跳过标题。请注意,在发布到 SO 时,您应该提供所有输入和代码,以便读者可以在自己的机器上重现问题。如果它很长,那么您需要减少它,以便您的示例最小但仍然说明问题。
  • 为什么第三行用逗号作为分隔符?
  • 假设数据实际上是逗号分隔而不是分号分隔,或者如您的帖子似乎表明的那样混合分隔,我会使用comment.char = ";"
  • 否则,如果它是混合的,我会在读入文档之前先 gsub 文档,以便所有分号都是逗号(反之亦然),然后读入并删除应该包含所有内容的最后一列缺少数据。
  • @James 我打错了逗号 - 所有行都用分号分隔。

标签: r csv


【解决方案1】:

这是发生了什么,如帮助文件?read.csv 中所述:

如果有标题并且第一行包含的字段少于 列数,输入中的第一列用于 行名。

a <- "header1;header2;header3
cell1;cell2;cell3;
cell4;cell5;cell6;"
read.table(text=a, sep=";")  
##       header1 header2 header3
## cell1   cell2   cell3      NA
## cell4   cell5   cell6      NA

因此,您的数据在第一列中必须有重复值,因为它将这些值视为行名。

我没有办法告诉read.csvread.table 不要这样做,因此您需要分别阅读列名和数据。

out <- read.table(text=a, sep=";", header=FALSE, skip=1)
out <- out[,-ncol(out)]
names(out) <- read.table(text=a, sep=";", nrow=1, header=FALSE,
                         stringsAsFactors=FALSE)
out
##   header1 header2 header3
## 1   cell1   cell2   cell3
## 2   cell4   cell5   cell6

或在一行中(不删除多余的列):

read.table(text=a, sep=";", header=FALSE, skip=1,
           col.names=c(read.table(text=a, sep=";", nrow=1, header=FALSE, 
           stringsAsFactors=FALSE),"X"))
##   header1 header2 header3  X
## 1   cell1   cell2   cell3 NA
## 2   cell4   cell5   cell6 NA

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 2015-10-27
    • 2018-10-25
    • 2019-06-28
    • 2011-03-24
    • 2023-03-05
    • 1970-01-01
    • 2014-03-20
    相关资源
    最近更新 更多