У меня есть фрейм данных, содержащий списки, как показано ниже:
# Load packages
library(dplyr)
# Create data frame
df <- structure(list(ID = 1:3,
A = structure(list(c(9, 8), c(7,6), c(6, 9)), ptype = numeric(0), class = c("vctrs_list_of", "vctrs_vctr")),
B = structure(list(c(3, 5), c(2, 6), c(1, 5)), ptype = numeric(0), class = c("vctrs_list_of", "vctrs_vctr")),
C = structure(list(c(6, 5), c(7, 6), c(8, 7)), ptype = numeric(0), class = c("vctrs_list_of", "vctrs_vctr")),
D = structure(list(c(5, 3), c(4, 1), c(6, 5)), ptype = numeric(0), class = c("vctrs_list_of", "vctrs_vctr"))),
row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))
# Peek at data
df
#> # A tibble: 3 x 5
#> ID A B C D
#> <int> <list> <list> <list> <list>
#> 1 1 <dbl [2]> <dbl [2]> <dbl [2]> <dbl [2]>
#> 2 2 <dbl [2]> <dbl [2]> <dbl [2]> <dbl [2]>
#> 3 3 <dbl [2]> <dbl [2]> <dbl [2]> <dbl [2]>
Я хотел бы распаковать списки и могу сделать это с помощью pmap_dfr
.
# Expand rows
df %>% purrr::pmap_dfr(function(...)data.frame(...))
#> ID A B C D
#> 1 1 9 3 6 5
#> 2 1 8 5 5 3
#> 3 2 7 2 7 4
#> 4 2 6 6 6 1
#> 5 3 6 1 8 6
#> 6 3 9 5 7 5
Создано 28.06.2019 с помощью пакета REPEX (v0.3.0)
Это желаемый результат, но, похоже, он изобретает колесо, потому что tidyr::unnest
предназначен для сглаживания столбцов списка обратно в обычные столбцы. Однако использование tidyr::unnest
вызывает следующую ошибку:
df %>% unnest(cols = c(A, B, C, D))
#Error: No common type for `x` <tbl_df<A:double>> and `y` <double>.
#Call `rlang::last_error()` to see a backtrace
Как мне применить unnest
в этом случае для сглаживания моего фрейма данных со столбцами списка?
Информация о версии
> packageVersion("tidyr")
[1] ‘0.8.3.9000’
unnest(df)
иpmap_dfr(df, data.frame)
, оба являются вашим предполагаемым результатом (хотя последний не являетсяtbl_df
). - person r2evans   schedule 28.06.2019unnest
выдает мне ошибку. Опять же, я использую разрабатываемую версию _2 _... - person Lyngbakr   schedule 28.06.2019tidyr-0.8.2
, возможно, у вас возникла новая проблема? - person r2evans   schedule 28.06.2019df %>% mutate_at(.vars = vars(A:D), as.list) %>% unnest(cols = A:D)
- person Joris C.   schedule 28.06.2019unnest(df, cols = c(A, B, C, D))
, и он тоже не работает для моей версии tidyr. Может быть, в этом проблема?unnest(df)
иunnest(df, A, B, C, D)
эквивалентны и работают нормально. - person gersht   schedule 28.06.2019tidyr
), вы можете опубликовать здесь ответ, в котором говорится, что (1) это текущая ошибка и (2) вот один или два обходных пути для время. Позже вы можете (3) обновить, когда версии github / CRAN будут исправлены. Спасибо, хорошая находка! - person r2evans   schedule 28.06.2019cols
в версии для разработчиков, получитсяWarning message: 'cols' is now required. Please use 'cols = c(A, B, C, D)'
- person Lyngbakr   schedule 28.06.2019nest
только что стал более сосредоточенным, и чтоchop
взял на себя некоторые из своих обязанностей. Смотрите мой ответ ниже и дайте мне знать, что вы думаете. - person gersht   schedule 28.06.2019