使用 read_csv 跳过列时如何使用缩写指定列类型

How to specify column types with abbreviations when skipping columns with read_csv

我想使用 readr 包中的 cols 函数支持的缩写从 CSV 文件中读取选定的列。但是,当我跳过列时,readr 会尝试猜测列类型,而不是使用我的规范,除非我按名称指定列或设置默认值。

这是一个可重现的例子:

library(tidyverse)

out <- tibble(a = c(1234, 5678),
       b = c(9876, 5432),
       c = c(4321, 8901))

write_csv(out, "test.csv")

test <- read_csv("test.csv",
                 col_select = c(a, c),
                 col_types = "cc")

typeof(test$c)
#> [1] "double"

我可以通过明确指出列名来获得正确的规范:

test2 <- read_csv("test.csv",
                 col_select = c(a, c),
                 col_types = c(a = "c", c = "c"))
typeof(test2$c)
#> [1] "character"

我也可以通过将字符设置为默认值来获得正确的规范,如 中所建议的那样。但我想知道是否有一种方法可以使用缩写“cc”获得正确的规范,或者——或者——如何根据被跳过的列生成缩写字符串。我的实际用例涉及大量跳过的列,所以我不想使用 -_ 来指定跳过的列。

请参阅 ?read_csvcol_types 的文档。您可以使用 _- 指定跳过的列:

read_csv("test.csv",
         col_select = c(a, c),
         col_types = "c-c")

结果:

# A tibble: 2 x 2                                                                                                                                                                                                      
  a     c    
  <chr> <chr>
1 1234  4321 
2 5678  8901

抱歉,我已经根据对您所问内容的假定理解重写了我之前写的内容,以使其更加清晰。

如果您想在任何跳过或手动更改之前为 csv 文件中的列获取 col_types,那么最简单的方法是使用文件的 spec_csv() 参数生成一个 col class 文本,向您展示 read_csv() 如何 class 确定每个列类型。

从那里您可以将其复制、粘贴和编辑到您的 col_types 参数中,以仅引入您想要的列和列类型。这可以使用 cols_only() 参数而不是 cols().

来完成
spec_csv("test.csv")

这将在您的输出控制台中自动生成:

cols(
  a = col_double(),
  b = col_double(),
  c = col_double()
)

输出将告诉您默认的 reader 列类型是什么(PS 您可以像操作 read_csv 参数一样操作 spec_csv() 参数来增加猜测大小,例如 guess_max 用于列类型。

#manually copied and pasted the above output, changed the default to the desired type and deleted the columns I didn't want

read_csv("test.csv",
         col_types=cols_only(a = col_character(),
                             c = col_character())
  )

我使用了长格式 (col_character),但您可以使用您之前已经指出的缩写形式。

请告诉我这是否是您要问的问题,或者我是否可以提供任何说明。