【问题标题】:how to skip reading certain columns in readr [duplicate]如何跳过阅读readr中的某些列[重复]
【发布时间】:2015-09-17 23:06:38
【问题描述】:

我有一个名为“test.csv”的简单 csv 文件,其内容如下:

colA,colB,colC
1,"x",12
2,"y",34
3,"z",56

假设我想跳过 colA 中的阅读,而只阅读 colB 和 colC。我想要一个通用的方法来做到这一点,因为我有很多文件要读入,有时 colA 完全被称为其他东西,但 colB 和 colC 总是相同的。

根据 read_csv 文档,实现此目的的一种方法是为 col_types 传递一个命名列表,并且只命名您想要保留的列:

read_csv('test.csv', col_types = list(colB = col_character(), colC = col_numeric()))

如果不提及 colA,它应该从输出中删除。但是,生成的数据框是:

Source: local data frame [3 x 3]

      colA colB colC
    1    1    x   12
    2    2    y   34
    3    3    z   56

是我做错了什么还是 read_csv 文档不正确?根据帮助文件:

如果是一个列表,它必须为每一列包含一个“收集器”。如果你 只想读取列的子集,可以使用命名列表 (其中名称给出列名)。如果未提及列 按名称,它不会包含在输出中。

【问题讨论】:

  • data.tablefreaddropselect参数,供参考
  • @jaap,不是重复的。这个问题是关于 readr::read_csv() 的,另一个问题是关于 utils::read.table() 的。
  • @Angelo 是的。链接的问题是关于阅读有限数量的列。在撰写该问题时,readr::read_csv 甚至都不存在。同时,它已被添加为答案(由我),以提供read.table/read.csv 的替代方法,因此可以用作重复目标。
  • @Jaap,好的,但是在提供范围明显大于原始问题的规范答案时,更改问题及其标签可能更好?或者您可以按照自己的方式回答问题:在 util::read.table() 的上下文中回答旧问题,在 readr::read_*() 的上下文中回答这个新问题。
  • @Angelo 在我看来,最好将旧问题更改为扩大其范围(就像我刚才所做的那样),因为它经常被用作规范的重复目标。

标签: r readr


【解决方案1】:

那里有一个答案,我只是没有足够努力地搜索: https://github.com/hadley/readr/issues/132

显然这是一个已更正的文档问题。最终可能会添加此功能,但 Hadley 认为只更新一种列类型而不删除其他列类型会更有用。

更新:该功能已添加

以下代码来自readr documentation

read_csv("iris.csv", col_types = cols_only( Species = col_factor(c("setosa", "versicolor", "virginica"))))

这将只读取 iris 数据集的 Species 列。为了只读取特定列,您还必须传递列规范,即col_factorcol_double 等...

【讨论】:

  • 所以简短的正确当前答案是:否?
  • 即使在 readr 1.0 发布之后,答案仍然是“否”。见github.com/hadley/readr/issues/194
  • github 暗示此错误已在 v 1.1.1 / 2017 年 5 月中修复。您能否确认并相应更新您的答案?
  • 一个只读取鸢尾花数据集read_csv("iris.csv", col_types = cols_only( Species = col_factor(c("setosa", "versicolor", "virginica"))) )中的Species列的例子。如果您只想读取特定列,您还必须通过列规范,即col_factor()col_double 等...
【解决方案2】:

“根据 read_csv 文档,实现此目的的一种方法是为 col_types 传递一个命名列表,并且只命名您想要保留的列”

WRONG: read_csv('test.csv', col_types=list(colB='c', colC='c'))

不,该文档具有误导性,您必须指定删除未命名的列 (class='_'/col_skip()),或者将它们的类明确指定为 NULL:

read_csv('test.csv', col_types=list('*'='_', colB='c', colC='c'))

read_csv('test.csv', col_types=list('colA'='_', colB='c', colC='c'))

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多