2017-04-08 60 views
2

有沒有一種方法來映射到任何類型的purrr::map`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,但是這不起作用,因爲它將列強制爲數字。

回答

5

purrr是類型穩定的,這需要一些習慣。

在這種情況下,它返回一個列表,您期望<date>

一個簡單的和「穩定」的解決方案,以你的情況將是更換第二mapmap_dbl並具有輸出轉身用as_date一個<date>對象lubridate的,就像這樣:

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_dblmap_chr覆蓋等