`purrr :: map`到任何类型

时间:2017-04-08 09:25:53

标签: r tidyverse purrr

是否可以使用purrr::map

映射到任何类型
library(tidyverse)
library(lubridate)

df <- data_frame(id = c(1, 1, 1, 2, 2, 2), 
                 val = c(1, 2, 3, 1, 2, 3), 
                 date = ymd("2017-01-01") + days(1:6))

df1 <- df %>% nest(-id) %>% 
  mutate(first_val = map_dbl(data, ~ .$val[1]), 
         first_day = map(data, ~ .$date[1]))

我希望first_day成为<date>df类型的列。我尝试了flatten,但这不起作用,因为它强制列为数字。

2 个答案:

答案 0 :(得分:5)

purrr是类型稳定的,这需要一些人习惯。

在这种情况下,它会返回一个您希望<date>

的列表

一个简单且稳定的&#34;您的解决方案是使用map替换第二个map_dbl,并使用<date> {{1}将输出转回lubridate对象像这样:

as_date

你得到:

df3 <- df %>% nest(-id) %>% 
   mutate(first_val = map_dbl(data, ~ .$val[1]), 
          first_day = as_date(map_dbl(data, ~ .$date[1])))

这是你想要的(对于这个例子)。

编辑:对于任何其他类型(# A tibble: 2 × 4 id data first_val first_day <dbl> <list> <dbl> <date> 1 <tibble [3 × 2]> 1 2017-01-02 2 <tibble [3 × 2]> 1 2017-01-05 除外),您必须找到不同的解决方案,但是,标准类型由专用<date>涵盖, map_lglmap_dbl

答案 1 :(得分:0)

map_dbl() %>% as_date()的替代方法是在感兴趣的输出列上使用unnest()

library(tidyverse)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date

df <- data_frame(id = c(1, 1, 1, 2, 2, 2), 
                 val = c(1, 2, 3, 1, 2, 3), 
                 date = ymd("2017-01-01") + days(1:6))

df %>% nest(-id) %>% 
  mutate(first_val = map_dbl(data, ~ .$val[1]), 
         first_day = map(data, ~ .$date[1])) %>% 
  unnest(first_day)
#> # A tibble: 2 x 4
#>      id data             first_val first_day 
#>   <dbl> <list>               <dbl> <date>    
#> 1     1 <tibble [3 × 2]>         1 2017-01-02
#> 2     2 <tibble [3 × 2]>         1 2017-01-05

reprex package(v0.2.1)于2018-11-17创建