我有一个名为" 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文档不正确?根据帮助文件:
如果是列表,则必须包含一个"收集器"对于每一列。如果你 只想读取列的子集,可以使用命名列表 (名称给出列名称)。如果没有提到列 按名称,它不会包含在输出中。
答案 0 :(得分:10)
有一个答案,我只是没有足够的搜索: https://github.com/hadley/readr/issues/132
显然这是一个已经纠正的文档问题。最终可能会添加此功能,但Hadley认为只更新一个列类型而不删除其他类型更有用。
答案 1 :(得分:3)
"根据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'))