26

我有一个名为“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 文档不正确?根据帮助文件:

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

4

2 回答 2

22

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

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

更新:该功能已添加

以下代码来自阅读器文档

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

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

于 2015-06-30T23:52:03.597 回答
5

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

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

不,该文档具有误导性,您必须指定删除未命名的 cols (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'))
于 2016-06-05T21:25:01.863 回答