I have the following data set:
> ex
# A tibble: 98 × 5
Country pred_data data model prdct
<chr> <list> <list> <list> <list>
1 Albania <tibble [10 × 2]> <tibble [9 × 3]> <betareg> <dbl [10]>
2 Angola <tibble [10 × 2]> <tibble [9 × 3]> <betareg> <dbl [10]>
3 Azerbaijan <tibble [10 × 2]> <tibble [9 × 3]> <betareg> <dbl [10]>
4 Algeria <tibble [10 × 2]> <tibble [9 × 3]> <betareg> <dbl [10]>
5 Armenia <tibble [10 × 2]> <tibble [9 × 3]> <betareg> <dbl [10]>
6 Laos <tibble [10 × 2]> <tibble [9 × 3]> <betareg> <dbl [10]>
7 Argentina <tibble [10 × 2]> <tibble [9 × 3]> <betareg> <dbl [10]>
8 Austria <tibble [10 × 2]> <tibble [9 × 3]> <betareg> <dbl [10]>
9 Barbados <tibble [10 × 2]> <tibble [9 × 3]> <betareg> <dbl [10]>
10 Belgium <tibble [10 × 2]> <tibble [9 × 3]> <betareg> <dbl [10]>
# … with 88 more rows
# ℹ Use `print(n = ...)` to see more rows
I am trying to create a new column that is a merge
or cbind
of pred_data
and prdct
, which should look in the data set as a <tibble [10 × 3]>
, but when I write the following code:
res <- ex %>%
group_by(Country) %>%
nest() %>%
mutate(pr2 = map2(pred_data, prdct, merge)) %>%
ungroup()
it gives me the following error:
Error in `mutate()`:
! Problem while computing `pr2 = map2(pred_data, prdct, merge)`.
ℹ The error occurred in group 1: Country = "Albania".
Caused by error in `map2()`:
! object 'pred_data' not found
Backtrace:
1. ... %>% ungroup()
8. purrr::map2(pred_data, prdct, merge)
Does someone know what I'm doing wrong? Can someone help me obtain the wanted result?
CodePudding user response:
The issue is that you nest
your data before using map2
which is not necessary. Also, for your desired result use cbind
not merge
.
Using some fake example data based on the gapminder
dataset:
library(gapminder)
library(dplyr, warn=FALSE)
library(tidyr)
library(purrr)
# example data
gap_nested <- gapminder %>%
group_by(country) %>%
nest() %>%
mutate(prdct = map(country, ~ runif(12)))
gap_nested <- gap_nested %>%
mutate(data = map2(data, prdct, ~ cbind(.x, prdct = .y)))
head(gap_nested)
#> # A tibble: 6 × 3
#> # Groups: country [6]
#> country data prdct
#> <fct> <list> <list>
#> 1 Afghanistan <df [12 × 6]> <dbl [12]>
#> 2 Albania <df [12 × 6]> <dbl [12]>
#> 3 Algeria <df [12 × 6]> <dbl [12]>
#> 4 Angola <df [12 × 6]> <dbl [12]>
#> 5 Argentina <df [12 × 6]> <dbl [12]>
#> 6 Australia <df [12 × 6]> <dbl [12]>
gap_nested$data[[1]]
#> continent year lifeExp pop gdpPercap prdct
#> 1 Asia 1952 28.801 8425333 779.4453 0.08012722
#> 2 Asia 1957 30.332 9240934 820.8530 0.82086328
#> 3 Asia 1962 31.997 10267083 853.1007 0.80174251
#> 4 Asia 1967 34.020 11537966 836.1971 0.31049317
#> 5 Asia 1972 36.088 13079460 739.9811 0.32704996
#> 6 Asia 1977 38.438 14880372 786.1134 0.68114361
#> 7 Asia 1982 39.854 12881816 978.0114 0.75686794
#> 8 Asia 1987 40.822 13867957 852.3959 0.40456933
#> 9 Asia 1992 41.674 16317921 649.3414 0.83969222
#> 10 Asia 1997 41.763 22227415 635.3414 0.64467924
#> 11 Asia 2002 42.129 25268405 726.7341 0.34743910
#> 12 Asia 2007 43.828 31889923 974.5803 0.54325215
CodePudding user response:
We could also do without map
as long as we keep it as a list column:
library(dplyr)
ex |>
group_by(country)
mutate(pr2 = list(bind_cols(data, tibble(prdct = prdct)))) |>
ungroup()
Output:
# A tibble: 142 × 4
# Groups: country [142]
country data prdct pr2
<fct> <list> <list> <list>
1 Afghanistan <tibble [12 × 5]> <dbl [12]> <tibble [12 × 6]>
2 Albania <tibble [12 × 5]> <dbl [12]> <tibble [12 × 6]>
3 Algeria <tibble [12 × 5]> <dbl [12]> <tibble [12 × 6]>
4 Angola <tibble [12 × 5]> <dbl [12]> <tibble [12 × 6]>
5 Argentina <tibble [12 × 5]> <dbl [12]> <tibble [12 × 6]>
6 Australia <tibble [12 × 5]> <dbl [12]> <tibble [12 × 6]>
7 Austria <tibble [12 × 5]> <dbl [12]> <tibble [12 × 6]>
8 Bahrain <tibble [12 × 5]> <dbl [12]> <tibble [12 × 6]>
9 Bangladesh <tibble [12 × 5]> <dbl [12]> <tibble [12 × 6]>
10 Belgium <tibble [12 × 5]> <dbl [12]> <tibble [12 × 6]>
# … with 132 more rows
Data (inspired by @stefan):
library(gapminder)
library(dplyr)
ex <-
gapminder |>
group_by(country) |>
nest() |>
mutate(prdct = list(runif(12))) |>
ungroup()