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

raj*_*jay 31 csv file-io r dataframe dplyr

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

问题是,当我使用readr :: read_csv时,似乎我可能必须在覆盖col_types时使用所有变量(请参阅下面的错误).这需要指定单独覆盖所有150列(?)..问题是:有没有办法指定覆盖特定列的col_type或命名的对象列表?在我的情况下,它将覆盖"数据文件年"列.

我知道任何省略的列都会被自动解析,这对我的分析很好.我认为它变得更复杂,因为列名在我下载的文件中有空格(例如,"数据文件年","国家代码")等.

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

我想,如果可能的话,其他选项只是跳过一起阅读第二列?

Nic*_*ick 40

如果有人在将来偶然发现这个问题,下面是对这个问题的更通用的答案.使用"skip"跳转列是不太可取的,因为如果导入的数据源结构发生更改,这将无法工作.

在您的示例中,可以更轻松地设置默认列类型,然后定义与默认列不同的任何列.

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

  read_csv(df, col_types = cols(.default = "d", date = "D"))
Run Code Online (Sandbox Code Playgroud)

或者,如果列日期应为"D"且列"xxx"为"i",请按以下步骤操作:

  read_csv(df, col_types = cols(.default = "d", date = "D", xxx = "i"))
Run Code Online (Sandbox Code Playgroud)

如果您有多个列并且只有特定的例外(例如"date"和"xxx"),则使用上面的"default"是强大的.

  • 我想补充一点,您可以使用 `.default = "?"` 来保留除异常之外的所有列的默认解析/猜测,而不是指定通用默认数据类型 (12认同)

小智 11

是.例如,强制将数字数据视为字符:

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
Run Code Online (Sandbox Code Playgroud)

选择是:

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
Run Code Online (Sandbox Code Playgroud)

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