首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tidygraph生成的列表列重塑数据帧

使用tidygraph生成的列表列重塑数据帧
EN

Stack Overflow用户
提问于 2018-01-11 20:09:56
回答 1查看 253关注 0票数 1

我正在使用tidygraph包,并尝试为下面的示例找到一个“整洁”的解决方案。这个问题并不是真的与tidygraph有关,而是更多地与数据争论有关,但我认为这对使用这个包的人来说很有趣。

在下面的代码块中,我只生成了一些示例数据。

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
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中的每个元素应用一个函数。结果就是一个简单的命名向量。

代码语言:javascript
复制
sub_graphs_df$graph %>% map(degree)

我不喜欢的第一件事是$的子集。有没有更好的方法?

接下来,我想将这个结果重塑为一个包含3列的data.frame。一列用于name (向量的名称属性),一列用于group (列表的名称属性),另一列用于number (向量的元素)。

我尝试了reshape2包中的melt

代码语言:javascript
复制
sub_graphs_df$graph %>% map(degree) %>% melt

它工作得很好,但是名称丢失了,在我阅读它的时候,应该使用tidyr。但是,我无法让gather工作,因为只接受data.frames

另一种选择是unlist

代码语言:javascript
复制
sub_graphs_df$graph %>% map(degree) %>% unlist

在这里,组和名称在名称属性中,我必须用正则表达式恢复它们。

我很确定有一种我想不到的简单方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-11 20:25:33

我们可以使用mutate创建一个list列,同时使用map应用函数,提取names和integer以及unnest以创建'long‘格式的数据集

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48206749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档