什么是允许的列对象形式" col _ *()"用于读取器?

时间:2018-06-01 22:55:29

标签: r readr

readr::read_csv误读了我正在加载的文件中的某些列类型,因此我想使用cols手动设置它们。

?read_csv中,它表示col_types参数应为_"'NULL'之一,'cols()'规范或字符串。有关更多详细信息,请参阅'小插图("列类型")'。好吧,vignette("column-types")提供了vignette("column-types") not found,所以我尝试了?cols。它表示它接受由'col _ *()'或其缩写字符名称"创建的列对象。

可接受的功能或缩写字符名称是什么?我在哪里可以找到该信息? readr 1.1.1 btw。

3 个答案:

答案 0 :(得分:3)

col_doublecol_integercol_charactercol_datecol_factor,。iec

library(readr)

mtcars <- read_csv(readr_example("mtcars.csv"), col_types = 
                     cols(
                       mpg = col_double(),
                       cyl = col_integer(),
                       disp = col_double(),
                       hp = col_integer(),
                       drat = col_double(),
                       vs = col_integer(),
                       wt = col_double(),
                       qsec = col_double(),
                       am = col_integer(),
                       gear = col_integer(),
                       carb = col_integer()
                     )
)
mtcars

#> # A tibble: 32 x 11
#>      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>    <dbl> <int> <dbl> <int> <dbl> <dbl> <dbl> <int> <int> <int> <int>
#>  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
#>  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
#>  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
#>  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
#>  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
#>  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
#>  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
#>  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
#>  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
#> 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
#> # ... with 22 more rows

或者,您可以使用紧凑的字符串表示形式,其中每个字符代表一列: c = characteri = integern = numberd = doublel = logicalD = dateT = date timet = time,{{ 1}},或? = guess / _跳过该列。

-

甚至更短

mtcars_select <- read_csv(readr_example("mtcars.csv"), 
                          col_types = cols_only(mpg = 'd', cyl = 'i', hp = 'i', 
                                                qsec = 'd', gear = 'i'),
                          na = c("NA", "N/A", "-9999", "-999"))
mtcars_select

#> # A tibble: 32 x 5
#>      mpg   cyl    hp  qsec  gear
#>    <dbl> <int> <int> <dbl> <int>
#>  1  21       6   110  16.5     4
#>  2  21       6   110  17.0     4
#>  3  22.8     4    93  18.6     4
#>  4  21.4     6   110  19.4     3
#>  5  18.7     8   175  17.0     3
#>  6  18.1     6   105  20.2     3
#>  7  14.3     8   245  15.8     3
#>  8  24.4     4    62  20       4
#>  9  22.8     4    95  22.9     4
#> 10  19.2     6   123  18.3     4
#> # ... with 22 more rows

价:

https://cran.r-project.org/web/packages/readr/vignettes/readr.html
https://www.rdocumentation.org/packages/readr/versions/1.1.1/topics/cols

答案 1 :(得分:1)

这可能不是可用的col_*()后缀的完整列表,但它很接近:

_logical
_integer
_double
_number
_character
_datetime
_date
_time
_factor

来自column-types vignette

  

如果要手动指定列类型,可以先复制并粘贴此代码,然后调整它来修复解析问题。

df3 <- read_csv(
    readr_example("challenge.csv"), 
    col_types = cols(
    x = col_double(),
    y = col_date(format = "")
    )
  )

本文重点介绍不同类型的解析器,它们按部分列出(原子向量,日期/时间等)。对于每个parse_()函数,都有一个等效的col_函数:

  

每个parse_ ()都与col _ ()函数耦合,该函数将用于解析完整的tibble。

答案 2 :(得分:1)

我也认为这没有明显的记录。您可以从col_types.R阅读readr的源代码,该代码会告诉您缩写:

"_" = ,
"-" = col_skip(),
"?" = col_guess(),
c = col_character(),
D = col_date(),
d = col_double(),
i = col_integer(),
l = col_logical(),
n = col_number(),
T = col_datetime(),
t = col_time()

设置列类型的方法是传递命名向量:

col_types = cols(column_1 = col_integer(), column2 = col_character())

或者,如果您使用col_names,只需传递相同长度的矢量。

如果覆盖默认值的原因是read_csv猜测类型错误,那么您可以使用spec_csv克服此问题并允许更多行用于猜测类型(默认情况下,使用1,000)。例如

x<- spec_csv(filename,guess_max=2000)
read_csv(filename,col_types = x)`