2017-04-08 9 views
2

Gibt es eine Möglichkeit, um jede Art zur Karte mit purrr::map`purrr :: map` auf jede Art

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])) 

ich first_day möchte eine Spalte des Typs sein <date> wie in df. Ich habe versucht, flatten, aber dies funktioniert nicht, wie es die Spalte auf numerisch erzwingt.

Antwort

5

purrr ist typenstabil und das ist etwas gewöhnungsbedürftig.

In diesem Fall gibt es eine Liste zurück, in der Sie eine <date> erwarten.

Ein einfache und „stabil“ Lösung für Sie wäre Fall sein, die zweiten map mit einem map_dbl zu ersetzen und hat die Ausgabe in ein <date> Objekt zurückgedreht mit lubridate ‚s as_date, wie folgt aus:

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

Sie erhalten:

# 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 

Was ist das, was Sie wollten (für dieses Beispiel).

EDIT: für alle anderen Arten (ausgenommen <date>) würden Sie eine andere Lösung finden müssen, jedoch sind die Standardtypen von der speziellen map_lgl, bedeckt map_dbl, map_chr usw.

Verwandte Themen