当存在许多列时,使用 readr::read_csv() 导入数据时覆盖列类型

Override column types when importing data using readr::read_csv() when there are many columns

提问人:rajvijay 提问时间:7/23/2015 更新时间:11/17/2017 访问量:64341

问:

我正在尝试在 R 中使用 readr::read_csv 读取 csv 文件。我导入的 csv 文件大约有 150 列,我只包括示例的前几列。我希望将第二列从默认类型(当我read_csv时是日期)覆盖为字符或其他日期格式。

GIS Join Match Code Data File Year  State Name  State Code  County Name County   Code   Area Name   Persons: Total
G0100010    2008-2012   Alabama 1   Autauga County  1   Autauga County, Alabama 54590

df <- data.frame("GIS Join Match Code"="G0100010", "Data File" = "2008-2012", "State" = "Alabama", "County" = "Autauga County", "Population" = 54590)

问题是,当我使用 readr::read_csv 时,似乎我必须在col_types中覆盖时使用所有变量(请参阅下面的错误)。也就是说,需要分别指定覆盖所有 150 列(?)..问题是:有没有办法指定仅覆盖特定列的col_type,或者一个命名的对象列表?就我而言,它只是覆盖“数据文件年份”列。

我知道任何省略的列都会被自动解析,这对我的分析来说很好。我认为它变得更加复杂,因为列名在我下载的文件中有一个空格(例如,“数据文件年份”、“州代码”)等。

tempdata <- read_csv(df, col_types = "cc")
Error: You have 135 column names, but 2 columns

如果可能的话,我想的另一种选择是跳过一起阅读第二列?

R CSV 文件-IO 数据帧 dplyr

评论

4赞 rajvijay 7/23/2015
弄清楚了,这奏效了!!temp.data <- read_csv(df, skip = 1, col_types = list( “数据文件年份” = col_character()))

答:

81赞 Nick 6/15/2016 #1

如果有人将来碰巧发现这个问题,这里有一个更通用的答案。不太建议使用“skip”来跳转列,因为如果导入的数据源结构发生更改,这将不起作用。

在您的示例中,只需设置默认列类型,然后定义与默认列不同的任何列,可能会更容易。

例如,如果所有列通常都是“d”,但日期列应该是“D”,则按如下方式加载数据:

  read_csv(df, col_types = cols(.default = "d", date = "D"))

或者,例如,如果列日期应为“D”,列“xxx”应为“i”,则按如下方式执行:

  read_csv(df, col_types = cols(.default = "d", date = "D", xxx = "i"))

如果您有多个列并且只有特定的例外(例如“date”和“xxx”),则上面的“default”使用非常强大。

评论

25赞 mkirzon 5/23/2020
我想补充一点,您可以使用它来保留除异常之外的所有列的默认解析/猜测,而不是指定通用默认数据类型.default = "?"
29赞 Lukasz 11/17/2017 #2

是的。例如,要强制将数值数据视为字符:

examplecsv = "a,b,c\n1,2,a\n3,4,d"
read_csv(examplecsv)
# A tibble: 2 x 3
#      a     b     c
#  <int> <int> <chr>
#1     1     2     a
#2     3     4     d
read_csv(examplecsv, col_types = cols(b = col_character()))
# A tibble: 2 x 3
#      a     b     c
#  <int> <chr> <chr>
#1     1     2     a
#2     3     4     d

选项包括:

col_character() 
col_date()
col_time() 
col_datetime() 
col_double() 
col_factor() # to enforce, will never be guessed
col_integer() 
col_logical() 
col_number() 
col_skip() # to force skip column

更多: http://readr.tidyverse.org/articles/readr.html