【问题标题】:Column names out by one after read.csv (cause is trailing comma)在 read.csv 之后列名减一(原因是尾随逗号)
【发布时间】:2018-09-14 21:17:28
【问题描述】:

我有以下最小的.csv 文件:

"Sl.no","Col1","Col2","Col3"
"1","one","two","three",
"2","A","B","C",

当我在 Excel 或 Google 表格中打开此文件时,文件已正确导入。

当我使用

将它导入到 RStudio 中的 R
temp <-  read.csv("file.csv", header = TRUE)

我在temp看到以下内容:

列标题减一。

当我删除第二行和第三行中的逗号时,即导入此文件:

"Sl.no","Col1","Col2","Col3"
"1","one","two","three"
"2","A","B","C"

文件被正确读取,temp 的结果是

问题:

  • .csv 文件中是否允许使用尾随逗号?如果不是,Excel 和 Google 表格是否可以容忍?
  • 如何删除逗号?我熟悉regex,但不确定如何将更改作为文本文件然后读取为.csv

【问题讨论】:

  • 您可以使用任何文本编辑器(如 sublime)删除尾随逗号
  • R 将 1,2,3,... 解释为行名,也应该在行尾始终有一个逗号,您在第一行中缺少一个逗号。
  • 根据文档:“如果有标题并且第一行包含的字段少于列数,则输入中的第一列用于行名。” - 所以我要么在第一行添加一个逗号,要么尝试删除尾随的逗号。如果做不到这一点,RLave 的解决方案就会奏效。

标签: r read.csv


【解决方案1】:

我建议采用不同的方法,使用 readr 包中的 read_csv

library(readr) 
temp <- read_csv("file.csv")

temp
# A tibble: 2 x 4
  Sl.no Col1  Col2  Col3 
  <int> <chr> <chr> <chr>
1     1 one   two   three
2     2 A     B     C 

使用的数据:

"Sl.no","Col1","Col2","Col3"
"1","one","two","three",
"2","A","B","C",

【讨论】:

  • 谢谢大家。在第一行末尾添加逗号是可行的,尽管有一个自动化的解决方案会很好。无论我是否在第一行添加额外的逗号,我都会收到 read_csv 的错误。示例错误:cols( Sl.no = col_integer(),...Warning: 2 parsing failures.
  • 我没有添加额外的逗号,我只是在编辑器中粘贴并保存为.csv,然后函数read_csv 可以正常工作。
  • 我刚刚复制了你的文件,然后运行了你的两行。我得到:Parsed with column specification: cols( Sl.no = col_integer(), Col1 = col_character(), Col2 = col_character(), Col3 = col_character() ) Warning: 2 parsing failures. row # A tibble: 2 x 5 col row col expected actual file expected &lt;int&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; &lt;chr&gt; actual 1 1 NA 4 columns 5 columns 'file.csv' file 2 2 NA 4 columns 5 columns 'file.csv'
【解决方案2】:

您可以尝试使用gsub 添加尾随逗号,然后使用read.csv 阅读

edited <- gsub(",,", ",", paste0(readLines("~/Desktop/file.csv"), ","), fixed = TRUE)
read.csv(textConnection(edited), header = TRUE, stringsAsFactors = FALSE)[1:4]
#>   Sl.no Col1 Col2  Col3 
#> 1     1  one  two three 
#> 2     2    A    B     C 

解释:首先您使用readLines“按原样”导入文本。接下来,使用paste0 在每一行的末尾添加一个逗号。之后,将“,” 的所有实例替换为“,”。最后,您使用textConnectionread.csv 来读取文件。请注意,我将 [1:4] 用于仅读取前 4 列。出于某种原因,我一直得到一个空白的第五列(可能来自我编写 csv 文件的方式)。

【讨论】:

  • 非常感谢大家。我不知道为什么我不能复制@RLave 的答案。我已经接受了你的回答,因为它对我有用,是一个“纯粹”的解决方案,我从中学到了几件事。我也得到了额外的列,但并不重要,因为它只是用于内部分析。
猜你喜欢
  • 2019-02-12
  • 2020-06-09
  • 2022-01-05
  • 1970-01-01
  • 2014-01-30
  • 2020-08-05
  • 2013-04-08
相关资源
最近更新 更多