有很多列时使用 readr::read_csv() 导入数据时覆盖列类型
Posted
技术标签:
【中文标题】有很多列时使用 readr::read_csv() 导入数据时覆盖列类型【英文标题】:Override column types when importing data using readr::read_csv() when there are many columns 【发布时间】:2015-10-12 15:21:34 【问题描述】:我正在尝试使用 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
如果可能的话,我猜的另一个选项是一起跳过阅读第二列?
【问题讨论】:
想通了,这行得通!!! temp.data 【参考方案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"))
如果您有多个列并且只有特定的例外(例如“日期”和“xxx”),则使用上面的“默认”非常强大。
【讨论】:
我要补充一点,您可以使用.default = "?"
为除您的异常之外的所有列保留默认解析/猜测,而不是指定通用默认数据类型【参考方案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
【讨论】:
以上是关于有很多列时使用 readr::read_csv() 导入数据时覆盖列类型的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL在简单查询中使用ORDER BY索引列时使用文件排序