Изменение формы фрейма данных с помощью столбца списка, созданного с помощью tidygraph
Я работаю с tidygraph
пакет и попробуйте найти "аккуратное" решение для примера ниже. Проблема на самом деле не связана с tidygraph
и больше о передаче данных, но я думаю, что это интересно для людей, работающих с этим пакетом.
В следующем фрагменте кода я просто генерирую некоторые примеры данных.
library(tidyverse)
library(tidygraph)
library(igraph)
library(randomNames)
library(reshape2)
graph <- play_smallworld(1, 100, 3, 0.05)
labeled_graph <- graph %>%
activate(nodes) %>%
mutate(group = sample(letters[1:3], size = 100, replace = TRUE),
name = randomNames(100)
)
sub_graphs_df <- labeled_graph %>%
morph(to_split, group) %>%
crystallise()
Результирующий data.frame
выглядит следующим образом:
sub_graphs_df
# A tibble: 3 x 2
name graph
<chr> <list>
1 group: a <S3: tbl_graph>
2 group: b <S3: tbl_graph>
3 group: c <S3: tbl_graph>
Теперь к моей актуальной проблеме. Я хочу применить функцию к каждому элементу в столбце graph
, Результатом является просто именованный вектор.
sub_graphs_df$graph %>% map(degree)
Первое, что мне не нравится, это подмножество $
, Есть ли способ лучше?
Далее я хочу преобразовать этот результат только в один data.frame с 3 столбцами. Один столбец для name
(имя атрибута векторов), один для group
(имя атрибута списка) и один для number
(элементы векторов).
Я старался melt
от reshape2
пакет.
sub_graphs_df$graph %>% map(degree) %>% melt
Он работает прилично, но имена потеряны, и, как я читаю, следует использовать tidyr
вместо. Однако я не мог получить gather
работать, потому что только data.frames
принимаются
Другой вариант будет unlist
:
sub_graphs_df$graph %>% map(degree) %>% unlist
Здесь группа и имя находятся в атрибуте names, и мне пришлось бы восстанавливать их с помощью регулярных выражений.
Я почти уверен, что есть простой способ, о котором я не мог думать.
1 ответ
Мы можем создать list
колонка с mutate
при применении функции с map
извлеките names
и целое число и unnest
создать набор данных "длинного" формата
sub_graphs_df %>%
mutate(newout = map(graph, degree)) %>%
transmute(name, group = map(newout, ~.x %>% names), number = map(newout, as.integer)) %>%
unnest
# A tibble: 100 x 3
# name group number
# <chr> <chr> <int>
# 1 group: a Seng, Trevor 0
# 2 group: a Buccieri, Joshua 1
# 3 group: a Street, Aimee 2
# 4 group: a Gonzalez, Corey 2
# 5 group: a Barber, Monique 1
# 6 group: a Doan, Christina 1
# 7 group: a Ninomiya, Janna 1
# 8 group: a Bazemore, Chao 1
# 9 group: a Perfecto, Jennifer 1
#10 group: a Lopez Jr, Vinette 0
# ... with 90 more rows