【问题标题】:Reshaping a data frame with a list column produced by tidygraph使用 tidygraph 生成的列表列重塑数据框
【发布时间】: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 %&gt;% mutate(newout = map(graph, ~degree(.x) %&gt;% stack)) %&gt;% .$newout %&gt;% setNames(., sub_graphs_df$name) %&gt;% bind_rows(., .id = 'name')

标签: r dplyr tidyr purrr tidygraph


【解决方案1】:

我们可以使用mutate 创建一个list 列,同时应用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

【讨论】:

  • ~.x的缩写来自哪个包?
  • @Alex map 来自purrr 以及相关的匿名电话
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 2013-06-23
  • 2021-06-05
  • 1970-01-01
相关资源
最近更新 更多