是否可以使用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
,但这不起作用,因为它强制列为数字。
答案 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_lgl
,map_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创建