首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >readr -如何从spec()更新col_spec对象

readr -如何从spec()更新col_spec对象
EN

Stack Overflow用户
提问于 2016-08-25 00:58:49
回答 1查看 1.5K关注 0票数 7

我喜欢这篇RStudio博客文章中描述的关于列规范的工作流。基本上,您可以在read_csv导入之后获取列规范,然后将其保存下来供以后使用。例如,在该职位上:

代码语言:javascript
复制
mtcars2 <- read_csv(readr_example("mtcars.csv"))
#> Parsed with column specification:
#> cols(
#>   mpg = col_double(),
#>   cyl = col_integer(),
#>   disp = col_double(),
#>   hp = col_integer(),
#>   drat = col_double(),
#>   wt = col_double(),
#>   qsec = col_double(),
#>   vs = col_integer(),
#>   am = col_integer(),
#>   gear = col_integer(),
#>   carb = col_integer()
#> )
# Once you've figured out the correct types
mtcars_spec <- write_rds(spec(mtcars2), "mtcars2-spec.rds")

# Every subsequent load
mtcars2 <- read_csv(
  readr_example("mtcars.csv"), 
  col_types = read_rds("mtcars2-spec.rds")
)

不幸的是,规范对象本身是具有属性的列表,但它们不符合通过read_csv参数提供给col_types函数的不同列规范

代码语言:javascript
复制
> mtcars_spec$cols$cyl
<collector_integer>
> str(mtcars_spec$cols$cyl)
 list()
 - attr(*, "class")= chr [1:2] "collector_integer" "collector"
> class(mtcars_spec)
[1] "col_spec"

而且,.rds文件在Windows中编辑起来很难看(至少对我来说是这样)。

我希望能够编辑一个大型col_spec对象(例如,跳过某些列,或者以其他方式编辑类)。我可以一直猜测需要编辑列表的字符串,如下所示:

代码语言:javascript
复制
attr(mtcars_spec$cols$cyl,"class")[1] = "collector_skip"` # this worked!
> mtcars_spec
cols(
  mpg = col_double(),
  cyl = col_skip(),
  disp = col_double(),
  hp = col_integer(),
  drat = col_double(),
  wt = col_double(),
  qsec = col_double(),
  vs = col_integer(),
  am = col_integer(),
  gear = col_integer(),
  carb = col_integer()
)

但这似乎很尴尬。是否有一种更优雅的方法来更新列分类,例如,在我的示例中,尝试跳过mtcars$cyl列?或者,如果不是一种优雅的方式,一种涵盖所有可能类型的方法?对于如何用不同的日期格式实现<collector_date>,我不想做太多猜测。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-04 02:55:51

下面是吉姆·海丝特( Jim Hester)的吉特布职位的最小版本

代码语言:javascript
复制
library(readr)
test_spec <- spec_csv('x,y,theDate,skipCol
  1,a,"21/01/2018", "skip1
  2,z,"31/01/2018", "skip2')

test_spec
#> cols(
#>   x = col_integer(),
#>   y = col_character(),
#>   theDate = col_character(),
#>   skipCol = col_character()
#> )

test_spec$cols[["theDate"]] <- col_date("%d/%m/%Y")
test_spec$cols[["skipCol"]] <- col_skip()

test_spec
#> cols(
#>   x = col_integer(),
#>   y = col_character(),
#>   theDate = col_date(format = "%d/%m/%Y"),
#>   skipCol = col_skip()
#> )

备注

  • 您需要知道数据的日期格式。
  • 您可以在文件上使用readr::spec_csv()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39135129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档