【发布时间】:2018-01-11 12:09:56
【问题描述】:
我正在使用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)
我不喜欢的第一件事是$ 的子集。有没有更好的办法?
接下来,我想将此结果重塑为一个只有 3 列的 data.frame。一列用于name(向量的名称属性),一列用于group(列表的名称属性),一列用于number(向量的元素)。
我尝试了 reshape2 包中的 melt。
sub_graphs_df$graph %>% map(degree) %>% melt
它工作得很好,但名字丢失了,当我读到它时,应该使用
tidyr 代替。但是,我无法让gather 工作,因为只接受data.frames。
另一个选项是unlist:
sub_graphs_df$graph %>% map(degree) %>% unlist
这里的组和名称在名称属性中,我必须使用正则表达式来恢复它们。
我很确定有一种我想不到的简单方法。
【问题讨论】:
-
另一个选项是
sub_graphs_df %>% mutate(newout = map(graph, ~degree(.x) %>% stack)) %>% .$newout %>% setNames(., sub_graphs_df$name) %>% bind_rows(., .id = 'name')
标签: r dplyr tidyr purrr tidygraph