R中的readr单列类型解析函数

4
readr包中,是否可以读取数据并在所有列中指定单个数据类型?类似于使用colClasses = "character"as.is参数的base::read.table。除非任务、数据头、文件编码等在分析之前得到了明确定义,否则我更喜欢编写我的加载器而不改变数据类型,然后在下游处理模式后处理模式。对于其他人如何考虑这些问题,我总是乐于听取建议。

这么重要的东西可能在文档中。 - Rich Scriven
1
为了将所有列设置为相同的类型,请使用 nmax = 1 读取一行以获取列数,然后使用 col_types = paste(rep("c", ncol), collapse = "")(表示“字符”)读取整个内容。 - Gregor Thomas
2
我认为询问 readr 是否具有与 read.table 中的 colClasses 相同的能力来回收列规范是相当合理的。我没有看到一种简洁、直接的方法来实现它,但我认为这将是在 GitHub 上提出一个很好的功能请求。 - joran
谢谢,是的,我查看了文档以及在Github上的col_types.R文件,但没有什么特别引人注目的。我同意肯定有解决方法,但可能会默认回到基本函数,而不进行任何形式的“诡计”(出于可维护性的原因)。 - gbartusk
2
就我所知,我有点怀疑 Hadley 是否会喜欢完全回收列规范的想法,但他可能会考虑添加一种紧凑、直接的方法,告诉 readr 将所有内容都读为字符(或其他单一类型)。 - joran
原则上,您不需要担心column_types,因为它们将从输入的前30行中推断出来。有关详细信息,请查看?read_table如果您确实想要在所有列中指定单个数据类型,则Gregor的答案非常好。 - rafa.pereira
2个回答

8

readr 0.2.2版本开始,我们可以像这样读取所有列都是字符类型的csv:

read_csv("path/to/file",col_types = cols(.default = col_character()))

3
将我的评论转换为答案。不,这个功能(目前)并没有内置,col_types 的文档清楚地说明了它的能力,但这不是其中之一。鉴于 col_types 的工作方式,实现此功能可能需要一个全新的参数,因为其特点是使用“短”col_types 来限制读取的列数。
但是,您可以编写一个包装器:
read_table_asis = function(...) {
    n_cols = ncol(read_table(..., n_max = 1))
    read_table(..., col_types = paste(rep("c", n_cols), collapse = ""))
}

最终我选择了这种方案,尽管有些不情愿,因为相比写出所有的read.table选项来说,这样按键次数更少……谢谢! - gbartusk

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