有没有办法映射到任何类型 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,但这不起作用,因为它强制列为数字.
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,等.
的替代方法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 日创建
有了purrr 1.0.0,就可以用了map_vec。
\n\n\n
map_vec()(与map2_vec()、 和 一起pmap_vec())可处理更多\n类型的向量。将、、\n和map_vec()扩展到任意类型的向量,例如\n日期、因子和日期时间:map_lgl()map_int()map_dbl()map_chr()
df %>% nest(data = -id) %>% \n mutate(first_val = map_dbl(data, ~ .$val[1]), \n first_day = map_vec(data, ~ .$date[1]))\nRun 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\nRun Code Online (Sandbox Code Playgroud)\nmap_vec将始终返回具有正确向量类的更简单的向量(如果没有通用类型,则会出错),但您也可以使用以下方式指定它.ptype:
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()))\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |