【问题标题】:Using tidyverse %>% pipe with Dates and format(); how to prevent gobbledygook characters?使用带有 Dates 和 format() 的 tidyverse %>% 管道;如何防止 gobbledygook 字符?
【发布时间】:2019-09-12 13:55:51
【问题描述】:

我有一个 tibble,其中有一列格式化为日期。出于问题的目的,我将生成类似的数据(真实数据要大得多!):

> dates = tribble(~YrMon, "2011-01-01", "2011-02-01", "2011-03-01", "2011-04-01") 
              %>% mutate(YrMon = as.Date(YrMon))
> dates
# A tibble: 4 x 1
  YrMon     
  <date>    
1 2011-01-01
2 2011-02-01
3 2011-03-01
4 2011-04-01

我只想隔离几个月。当我在不使用管道的情况下提取月份时,它按预期工作:

> format(dates$YrMon, "%m")
[1] "01" "02" "03" "04"

但是,当我使用 tidyverse 管道做我认为应该是相同的事情时,我会得到 gobbledygook(我认为这是返回的 tibble 的某种格式):

> dates %>% format(.$YrMon, "%m")
[1] "\033[38;5;246m# A tibble: 4 x 1\033[39m"          
[2] "  YrMon     "                                     
[3] "  \033[3m\033[38;5;246m<date>\033[39m\033[23m    "
[4] "\033[38;5;250m1\033[39m 2011-01-01"               
[5] "\033[38;5;250m2\033[39m 2011-02-01"               
[6] "\033[38;5;250m3\033[39m 2011-03-01"               
[7] "\033[38;5;250m4\033[39m 2011-04-01"

发生了什么,有没有办法使用 %>% 管道获得预期的答案?

【问题讨论】:

  • 什么是 gobbledygook?它有一个更简单的术语吗?另外,为什么不将所有内容都放入 mutate 或 pull and format 中?或润滑的月份?这是pull:dates %&gt;% pull(YrMon) %&gt;% format(., "%m") 的东西,但我会选择month
  • 或试试dates$YrMon %&gt;% format(., "%m")
  • dates %&gt;% with(., format(YrMon, "%m"))

标签: r pipe tidyverse


【解决方案1】:

您可以通过多种方式实现所需的输出。我们可以使用pull来提取我们的目标列并进行如下处理:

dates %>% pull(YrMon) %>% format(., "%m")
[1] "01" "02" "03" "04"

或者,我们可以简单地使用mutate,如下所示:

dates %>% 
 mutate(YrMon = format(YrMon, "%m"))
# A tibble: 4 x 1
  YrMon
  <chr>
1 01   
2 02   
3 03   
4 04 

也可以用lubridatemonth(返回一个整数)得到月份:

dates %>% 
   mutate(YrMon = month(YrMon))
# A tibble: 4 x 1
  YrMon
  <int>
1     1
2     2
3     3
4     4

使用map(给我们一个列表,使用map_* 覆盖):

dates %>% 
   map(.,format,"%m")
$YrMon
[1] "01" "02" "03" "04"

不使用管道,可以简单地做:

with(dates, format(YrMon, "%m"))
[1] "01" "02" "03" "04"

【讨论】:

  • 感谢@NelsonGon。第一个 mutate 答案特别有帮助 - 我不知道为什么我没有尝试明显的!
【解决方案2】:

你不想自动插入点所以使用这个:

dates %>% { format(.$YrMon, "%m") }
## [1] "01" "02" "03" "04"

或使用 magrittr %$% 管道:

library(magrittr)
dates %$% format(YrMon, "%m")
## [1] "01" "02" "03" "04"

这也可以:

dates %>% with(format(YrMon, "%m"))
## [1] "01" "02" "03" "04"

【讨论】:

  • 谢谢!您的回答有效,我很感激。我将支票交给@NelsonGon 以获得变异的答案。无意冒犯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多