Пример работает, как и ожидалось, но проблема присутствует в самом шаге 1.
Чтобы показать, что пример работает, вы можете изменить wt_P
на wt_C
, и он работает.
library(tidyverse)
mtcarsT %>%
mutate(data = pmap(.l = list(a = data, b = vs, c = gear),
.f = function(a, b, c)
a %>% dplyr::mutate(vs_gear = wt_C - b + c)))
# cyl vs gear data
# <dbl> <dbl> <dbl> <list>
# 1 6 0 4 <tibble [1 × 11]>
# 2 4 1 4 <tibble [8 × 11]>
# 3 6 1 3 <tibble [2 × 11]>
#....
Проблема на шаге 1 заключается в том, что вы делаете
mtcars %>% as_tibble() %>%
group_by(cyl, gear, vs) %>%
mutate(cp_flag = rep(c('C', 'P'), length.out = n()))
есть определенные группы с одним наблюдением, которые вообще не получают значение P
.
mtcars %>% count(cyl, gear, vs)
# A tibble: 10 x 4
# cyl gear vs n
# <dbl> <dbl> <dbl> <int>
# 1 4 3 1 1
# 2 4 4 1 8
# 3 4 5 0 1
# 4 4 5 1 1
# 5 6 3 1 2
# 6 6 4 0 2
# 7 6 4 1 2
# 8 6 5 0 1
# 9 8 3 0 12
#10 8 5 0 2
Следовательно, wt_P
для них не рассчитывается и возвращает ошибку, тогда как wt_C
- нет. Если вы измените порядок в rep
с c('C', 'P')
на c('P', 'C')
, вы получите ошибку для wt_C
, и wt_P
будет работать, как ожидалось.
Чтобы добавить отсутствующий столбец, мы можем сделать:
mtcars %>%
group_by(cyl, gear, vs) %>%
mutate(cp_flag = rep(c('C', 'P'), length.out = n())) %>%
nest() %>%
mutate(data = map(data, ~{
temp <- .x %>%
group_by(mpg, disp, hp, drat, am, carb) %>%
pivot_wider(names_from = cp_flag, values_from = wt:qsec,
values_fill = list(wt = NA, qsec = NA)) %>%
ungroup()
temp[setdiff(cols, names(temp))] <- NA;temp
}))
# cyl vs gear data
# <dbl> <dbl> <dbl> <list>
# 1 6 0 4 <tibble [1 × 10]>
# 2 4 1 4 <tibble [8 × 10]>
# 3 6 1 3 <tibble [2 × 10]>
# 4 8 0 3 <tibble [12 × 10]>
# 5 6 1 4 <tibble [2 × 10]>
# 6 4 1 3 <tibble [1 × 10]>
# 7 4 0 5 <tibble [1 × 10]>
# 8 4 1 5 <tibble [1 × 10]>
# 9 8 0 5 <tibble [2 × 10]>
#10 6 0 5 <tibble [1 × 10]>
Таким образом, все они имеют одинаковое количество столбцов.