Распаковка списка-столбца многорядных столбцов с сохранением количества строк - PullRequest
1 голос
/ 20 апреля 2020

У меня есть столбец, в котором один столбец представляет собой список элементов. Некоторые тиблы в этом списке имеют более одной строки. Вот минимальный пример:

library(tibble)
tmp <- tribble(
  ~x, ~y,
   1,  tibble(a=1,   b=2),
   2,  tibble(a=4:5, b=6:7))

, который производит

> tmp 
# A tibble: 2 x 2
      x y               
  <dbl> <list>          
1     1 <tibble [1 x 2]>
2     2 <tibble [2 x 2]>

Я хочу создать тиббл, который имеет то же количество строк, что и tmp, и расширяет столбец списка в столько столбцов, сколько необходимо. В этом примере я хочу

      x      a1      a2      b1      b2
  <int>   <dbl>   <dbl>   <dbl>   <dbl>
1     1       1      NA       2      NA
2     2       4       5       6       7

Я думал сделать это с некоторой комбинацией unnest() и pivot_wider() или, возможно, flatten(), но я не могу заставить его работать. Каков наилучший способ сделать это?

В этом примере столбцы в столбце списка никогда не имеют более двух строк. Но в моем реальном списке-столбцах некоторые столбцы имеют одну строку, некоторые - две, а некоторые - более двух. Поэтому я ищу решение, которое работает, когда в столбцах списка есть произвольное количество строк.

1 Ответ

3 голосов
/ 20 апреля 2020

Вот одно решение с использованием unnest_wider

library(tidyr)
unnest_wider(tmp, y) %>% 
      unnest_wider(a, names_repair = ~gsub('...', 'a', .)) %>% 
      unnest_wider(b, names_repair = ~gsub('...', 'b', .))

New names:
* `` -> ...1
...
New names:
* `` -> ...1
* `` -> ...2
# A tibble: 2 x 5
      x    a1    a2    b1    b2
  <dbl> <dbl> <int> <dbl> <int>
1     1     1    NA     2    NA
2     2     4     5     6     7
...