【问题标题】:How to avoid purrr::pmap_dfr converting Date to numeric如何避免 purrr::pmap_dfr 将日期转换为数字
【发布时间】:2018-01-12 12:57:51
【问题描述】:

为什么 purrr::pmap_dfr 将 Date 转换为数字,我该如何避免?

这是一个带有三种不同类型列的 data.frame 示例。 如您所见,有一个日期列。使用 purr::pmap_dfr 后是数字:

library(tidyverse)
library(lubridate)

df <- data.frame(
  a = c('a', 'b', 'c'),
  b = c(10, 20, 30),
  c = c(100.5, 200.5, 300.5),
  d = c(ymd("2016-01-01"), ymd("2017-01-01"), ymd("2018-01-01")),
  stringsAsFactors = FALSE
)

f <- function(a, b, c, d){
  r <- data_frame(a=a, b=b, c=c, d=d, class.of.d=class(d))
  return(r)
}

pmap_dfr(df, f)

结果是

 # A tibble: 3 x 5
      a     b     c     d class.of.d
  <chr> <dbl> <dbl> <dbl>      <chr>
1     a    10 100.5 16801    numeric
2     b    20 200.5 17167    numeric
3     c    30 300.5 17532    numeric   

【问题讨论】:

  • 看起来是bug。提交了多个问题。检查here

标签: r purrr


【解决方案1】:

这是 pmap_dfr 的一个已知问题。见https://github.com/tidyverse/purrr/issues/358

【讨论】:

    【解决方案2】:

    我不确定你为什么在这里使用 pmap_dfr。你想映射什么?

    f <- function(x){
      r <- data_frame(a=x$a, b=x$b, c=x$c, d=x$d, class.of.d=class(d))
      return(r)
    }
    
    
    f(df)
    

    产量

     a         b     c d          class.of.d
      <chr> <dbl> <dbl> <date>     <chr>     
    1 a      10.0   100 2016-01-01 Date      
    2 b      20.0   200 2017-01-01 Date      
    3 c      30.0   300 2018-01-01 Date  
    

    也许你的意思

    h <- function(x){
     class(x)
    
    }
    
    map_dfr(df, h)
    

    返回

      a         b       c       d    
      <chr>     <chr>   <chr>   <chr>
    1 character numeric numeric Date 
    

    map_dfr() 的工作方式是将函数(在本例中为 class())应用于数据框中的每一列。您无需在函数中写出列,只需获取数据框,然后 map 即可完成拆分工作。

    【讨论】:

    • 这是一个例子。我真正的问题要复杂得多,所以我将其简化为这里的示例。
    • 嗯,真的不清楚你在问什么,或者为什么你会以这种方式使用地图。您是否试图将每一列变成一个单独的数据框?
    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 2020-03-11
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多