`purrr :: map`到任何类型

joh*_*nes 3 r purrr tidyverse

有没有办法映射到任何类型 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]))
Run Code Online (Sandbox Code Playgroud)

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

Adi*_*rid 6

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

在这种情况下,它会返回您期望的列表<date>.

一个简单而"稳定"的解决方案就是map用a 替换第二个map_dbl<date>使用lubridate's 将输出转回一个对象as_date,如下所示:

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

你得到:

# 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
Run Code Online (Sandbox Code Playgroud)

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

编辑:对于任何其他类型的(除<date>),你将不得不寻找不同的解决方案,但是,标准类型所涵盖的专用map_lgl,map_dbl,map_chr,等.


Mat*_*fou 5

的替代方法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
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.2.1)于 2018 年 11 月 17 日创建


Maë*_*aël 4

有了purrr 1.0.0,就可以用了map_vec

\n
\n

map_vec()(与map2_vec()、 和 一起pmap_vec())可处理更多\n类型的向量。将、、\n和map_vec()扩展到任意类型的向量,例如\n日期、因子和日期时间:map_lgl()map_int()map_dbl()map_chr()

\n
\n
df %>% nest(data = -id) %>% \n  mutate(first_val = map_dbl(data, ~ .$val[1]), \n         first_day = map_vec(data, ~ .$date[1]))\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
# A tibble: 2 \xc3\x97 4\n     id data             first_val first_day \n  <dbl> <list>               <dbl> <date>    \n1     1 <tibble [3 \xc3\x97 2]>         1 2017-01-02\n2     2 <tibble [3 \xc3\x97 2]>         1 2017-01-05\n
Run Code Online (Sandbox Code Playgroud)\n
\n

map_vec将始终返回具有正确向量类的更简单的向量(如果没有通用类型,则会出错),但您也可以使用以下方式指定它.ptype

\n
df %>% nest(data = -id) %>% \n  mutate(first_val = map_vec(data, ~ .$val[1], .ptype = integer()), \n         first_day = map_vec(data, ~ .$date[1], .ptype = Date()))\n
Run Code Online (Sandbox Code Playgroud)\n