purrr: объединение столбцов, вложенных в разные столбцы списка - PullRequest
0 голосов
/ 18 февраля 2019

Это, по сути, дополнительный вопрос к предыдущему одному , на который любезно ответил @keqiang-li.

У меня есть кадр данных, который включает столбец списка (вложенные кадры данных), содержащийпартии в правительстве и количество их соответствующих мест.Этот фрейм данных разделен по странам (обратите внимание, что я использовал новые dplyr 0,8 group_nest и group_split).

По сути, я пытаюсь получить еще один столбец списка, в котором для каждого правительства есть список длякаждое предыдущее правительство, имеющее информационный блок, указывающий на перекрытие партий и мест.

library(tidyverse)


df <- tibble::tribble(
  ~period, ~party, ~seats,
  1,    "A",      2,
  1,    "B",      3,
  1,    "C",      3,
  2,    "A",      2,
  2,    "C",      3,
  3,    "C",      4,
  3,    "E",      1,
  3,    "F",      3
)

df <- bind_rows(AA=df, BB=df, .id="country")

df <- df %>% 
  group_by(country, period) %>% 
  group_nest() %>% 
  #mutate(gov=map(data, "party") %>% map(.,list)) %>% 
  mutate(prev.govs=map(data, "party") %>% 
           map(., list) %>%
           accumulate(.,union))

df <- df %>% 
  group_split(country) %>% 
  map(., ~mutate(., prev.govs.df=map_depth(prev.govs, 2, enframe, value="party")))

df - моя отправная точка.Ниже безуспешных попыток.

##attempts
df %>% 
  map(., ~mutate(., df.overlap=map_depth(prev.govs.df, 3, ~map2(., data, inner_join))))
#> Error in UseMethod("inner_join"): nicht anwendbare Methode für 'inner_join' auf Objekt der Klasse "c('integer', 'numeric')" angewendet

df %>% 
  map(., ~mutate(., df.overlap=map_depth(prev.govs.df, 2, ~map2(., data, inner_join))))
#> Error: Mapped vectors must have consistent lengths:
#> * `.x` has length 2
#> * `.y` has length 3

df %>% 
  map(., ~mutate(., df.overlap=map2(data, prev.govs.df, ~map2(.x, .y, ~map2(.x, .y, inner_join)))))
#> Error: Mapped vectors must have consistent lengths:
#> * `.x` has length 3
#> * `.y` has length 2

На более конкретном уровне решением для country AA в периоде 3 будут 3 списка, каждый из которых содержит столбик с строками из data, которые перекрываются с теми, что вprev.govs.def в столбце party (ключ)

df[[1]][["prev.govs.df"]][[3]] 
#> [[1]]
#> # A tibble: 3 x 2
#>    name party
#>   <int> <chr>
#> 1     1 A    
#> 2     2 B    
#> 3     3 C    
#> 
#> [[2]]
#> # A tibble: 2 x 2
#>    name party
#>   <int> <chr>
#> 1     1 A    
#> 2     2 C    
#> 
#> [[3]]
#> # A tibble: 3 x 2
#>    name party
#>   <int> <chr>
#> 1     1 C    
#> 2     2 E    
#> 3     3 F
df[[1]][["data"]][[3]]
#> # A tibble: 3 x 2
#>   party seats
#>   <chr> <dbl>
#> 1 C         4
#> 2 E         1
#> 3 F         3

Ответ на предыдущий вопрос решил загадку, как пересекать два списка.К сожалению, я не мог понять, как сделать следующий шаг, который повлечет за собой разбиение кадра данных и объединение вложенных фрагментов.

Отлично подходит для любой подсказки!

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Третья попытка ОП на самом деле очень близка.Нам просто нужно изменить последний map следующим образом:

library(tidyverse)

output <- df %>%
  map(~mutate(., df.overlap = map2(data, prev.govs.df, ~map(.y, inner_join, .x))))

Вывод:

[[1]]
# A tibble: 3 x 6
  country period data             prev.govs  prev.govs.df df.overlap
  <chr>    <dbl> <list>           <list>     <list>       <list>    
1 AA           1 <tibble [3 x 2]> <list [1]> <list [1]>   <list [1]>
2 AA           2 <tibble [2 x 2]> <list [2]> <list [2]>   <list [2]>
3 AA           3 <tibble [3 x 2]> <list [3]> <list [3]>   <list [3]>

[[2]]
# A tibble: 3 x 6
  country period data             prev.govs  prev.govs.df df.overlap
  <chr>    <dbl> <list>           <list>     <list>       <list>    
1 BB           1 <tibble [3 x 2]> <list [3]> <list [3]>   <list [3]>
2 BB           2 <tibble [2 x 2]> <list [3]> <list [3]>   <list [3]>
3 BB           3 <tibble [3 x 2]> <list [3]> <list [3]>   <list [3]>

> output[[1]]$df.overlap[[3]]
[[1]]
# A tibble: 1 x 3
   name party seats
  <int> <chr> <dbl>
1     3 C         4

[[2]]
# A tibble: 1 x 3
   name party seats
  <int> <chr> <dbl>
1     2 C         4

[[3]]
# A tibble: 3 x 3
   name party seats
  <int> <chr> <dbl>
1     1 C         4
2     2 E         1
3     3 F         3
0 голосов
/ 18 февраля 2019

Одной из причин может быть проблема с разницей в length из list элементов.Мы могли бы rep разрешить одному из элементов list сделать одинаковые длины, а затем сделать inner_join

out <- df %>%
         map(., ~ .x %>% 
             mutate(df.overlap = map2(prev.govs.df, data, ~ 
                map2(rep(list(.y), length(.x)), .x, inner_join))))

-выход

out[[1]]
# A tibble: 3 x 6
#  country period data             prev.govs  prev.govs.df df.overlap
#  <chr>    <dbl> <list>           <list>     <list>       <list>    
#1 AA           1 <tibble [3 × 2]> <list [1]> <list [1]>   <list [1]>
#2 AA           2 <tibble [2 × 2]> <list [2]> <list [2]>   <list [2]>
#3 AA           3 <tibble [3 × 2]> <list [3]> <list [3]>   <list [3]>

# overlap column element
out[[1]]$df.overlap[[3]][[1]]
# A tibble: 1 x 3
#  party seats  name
#  <chr> <dbl> <int>
#1 C         4     3


# input dataset elements used for joining
out[[1]]$data[[3]]
# A tibble: 3 x 2
#  party seats
#  <chr> <dbl>
#1 C         4
#2 E         1
#3 F         3

out[[1]]$prev.govs.df[[3]][[1]]
# A tibble: 3 x 2
#   name party
#  <int> <chr>
#1     1 A    
#2     2 B    
#3     3 C    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...