如何跳过readr中特定的列进行读取

28

我有一个简单的CSV文件,名为"test.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文档不正确? 根据帮助文件:

如果是一个列表,则必须为每个列指定一个“collector”。 如果您只想读取部分列,则可以使用命名列表(其中名称给出列名称)。 如果未按名称提及某一列,则该列将不包含在输出中。


2
data.tablefread 函数有 dropselect 参数,用于此目的,请参考。 - MichaelChirico
3
@jaap,不是重复问题。这个问题是关于readr::read_csv()的,另一个问题是关于utils::read.table()的。 - Angelo
@Angelo 是的。相关问题是关于读取有限列的。在那个问题被提出时,readr::read_csv甚至还不存在。与此同时,我已经将其作为答案添加了进去,以提供替代read.table/read.csv的方法,并因此可以作为重复目标。 - Jaap
@Jaap,好的,但是当提供一个范围显著大于原始问题的规范答案时,也许更好的方法是更改问题及其标签?或者您可以根据它们自己的条件回答这些问题:在util::read.table()的上下文中回答旧问题,在readr::read_*()的上下文中回答新问题。 - Angelo
@Angelo 我认为最好改变旧问题的范围(就像我刚才所做的那样),因为它经常用作规范重复目标。 - Jaap
显示剩余4条评论
2个回答

23

有一个答案在那里,我只是没有搜索得够深入:https://github.com/hadley/readr/issues/132

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

更新:该功能已经被添加。

以下代码来自readr 文档

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

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


3
因此,简短的正确答案是:不是? - userJT
即使在readr 1.0发布后,答案仍然是否定的。请参见https://github.com/hadley/readr/issues/194 - vergilcw
Github 上面的记录显示这个 bug 在 2017 年 5 月的版本 1.1.1 中已经被修复了。您能否确认一下,并相应地更新您的回答? - smci
一个示例,仅读取鸢尾花数据集中的物种列 read_csv("iris.csv", col_types = cols_only( Species = col_factor(c("setosa", "versicolor", "virginica"))) )。如果您只想读取特定的列,您还必须传递列规范,例如 col_factor()col_double 等等... - spies006

6
"根据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'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接