【问题标题】:read.csv vs read.table - difficulty in comparing resultsread.csv vs read.table - 比较结果的困难
【发布时间】:2015-06-30 15:56:28
【问题描述】:

我有一个制表符分隔的数据,其中有一列包含地址,地址中包含逗号。

我正在使用 read.table 将数据导入 R,但是我的同事使用带有 sep="\t" 的 read.csv 来做同样的事情,我们最终在导入的数据框中都有不同的行数。

另外,当我在 Excel 中导入数据时,我得到的记录数与 sep="\t" 的 read.csv 相同。

我可以验证哪个导入和记录数是正确的最具体的方法是什么?

请让我知道我可以在此处添加哪些详细信息来帮助回答问题。

【问题讨论】:

  • 您可以在gist.github.com 上发布几行您的csv,并提供链接和几行代码来导入csv。 sep 参数很重要,但您也可以考虑 quotedec。另一种解决方案是在readr 包中使用read_delim

标签: r csv


【解决方案1】:

通过?read.table 阅读这两个函数的帮助文件(这将同时显示)。您会看到read.csv 只是read.table,其中一些参数设置为不同的默认值。

其中一个论点是header。在read.tablesep="\t" 中,也可以尝试使用header=TRUE

如果这不起作用,请执行以下操作:read.table('file.txt', header=TRUE, sep="\t", quote="\"", dec=".", fill=TRUE, comment.char=""。该代码应该给出与read.csv 完全相同的结果,因为我只是将所有参数设置为read.csv 使用的参数。然后,您可以首先将其中一些参数更改回 read.table 默认值(通过不指定它们)来确定哪个参数导致您的 data.frame 的 read.csvread.table 之间存在差异(请记住,不止一个论点可能导致差异)。我可以很容易地看到headersepquotecomment.charfill 参数可能会影响输出中的行数。我无法想象dec 会如何产生这种效果,但如果它很重要,我不会感到惊讶。

通常,我倾向于期望不同的输入 = 不同的输出,而当不同的输入 = 相同的输出时,我认为这是例外的。您使用的函数相似,但它们的区别在于解释文本文件的不同方式,所以我期望它们会产生不同的结果。哪个是“正确的”不是一个功能正确执行和另一个错误执行的问题,而是用户理解他们在与输入相关的情况下所做的事情。

【讨论】:

  • 我完全同意并理解。我现在正在尝试这个。但是,确认哪个工作正常的最佳方法是什么,我的意思是原始文件有 400k 条记录,无法检查确切的记录数是多少,哪个 read.table 或 read.csv 做得正确。有什么想法吗?
  • 我会使用 t1 <- read.csv()t2 <- read.table()dim(t1)dim(t2) 之类的东西。那有意义吗?想想是什么参数集导致他们给出不同的答案,以及你正在阅读的 csv 类型。当我的数据文件有一个“注释”列时,我必须非常小心如何解释各种字符(特别是 comment 参数很有用)。抱歉,如果我觉得我很迂腐,我不清楚你是否认为这是一个“错误”,read.aable 给出了令人惊讶的结果。
  • 要清楚,当有评论栏时,考虑当有人输入“阳光温暖,船需要修理,用#2铅笔输入数据”时会发生什么! “#”有时被认为是“注释”,逗号可以解释为列分隔符。 (我无法确认这里到底会发生什么,但我想你可以明白我的观点,当文本文件的一部分是人类随便输入的条目时,你必须小心)
  • 这并不迂腐。我不认为这是一个错误。 (1)我不知道为什么会有差异,现在我很清楚,我使用了你的建议,现在我得到与 quote="\"" 相同的记录数。(2)我如何确保它实际上在 quote="\"" 之前或在 'quote="\"" ' 之后是正确的?
  • 我会做 head(t1)tail(t1),然后对 t2 做同样的事情。我希望 R 输出会有明显的差异。然后我会问自己哪个更有意义(对我来说,作为一个对数据应该是什么样子有预先期望的人),并采用似乎以我想要的方式解释数据文件的任何方法。我敢打赌,使用quote="\"" 是您想要的,b/c 我很确定这会阻止一列中的sunny,boat 被解释为两列sunnyboat为另一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
相关资源
最近更新 更多