如何在网络分析中处理空值/Nas [英] How to handle null values /NAs in network analysis

查看:13
本文介绍了如何在网络分析中处理空值/Nas的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此问题基本上是我发布的上一个问题here的扩展。
如何在这些类型的情况下处理空值/NAS。 场景和数据示例

df1 <- data.frame(
  stringsAsFactors = FALSE,
                    id_1 = c("ABC","ABC","BCD",
                             "CDE","DEF","EFG","GHI","HIJ","IJK","JKL",
                             "GHI","KLM","LMN","MNO","NOP"),
                    id_2 = c("1A","2A","3A",
                             "1A","4A","5A","6A",NA,"9A","10A","7A",
                             "12A","13A",NA,"15A"),
                    id_3 = c("Z3","Z2","Z1",
                             "Z4","Z1","Z5","Z5","Z6","Z7","Z8","Z6","Z8",
                             "Z9","Z9","Z1"),
                    Name = c("StackOverflow1",
                             "StackOverflow2","StackOverflow3","StackOverflow4",
                             "StackOverflow5","StackOverflow6",
                             "StackOverflow7","StackOverflow8","StackOverflow9",
                             "StackOverflow10","StackOverflow11","StackOverflow12",
                             "StackOverflow13","StackOverflow14","StackOverflow15"),
          desired_output = c(1L,1L,2L,1L,2L,
                             3L,3L,3L,4L,5L,3L,5L,6L,6L,2L)
      )

df1
   id_1 id_2 id_3            Name desired_output
1   ABC   1A   Z3  StackOverflow1              1
2   ABC   2A   Z2  StackOverflow2              1
3   BCD   3A   Z1  StackOverflow3              2
4   CDE   1A   Z4  StackOverflow4              1
5   DEF   4A   Z1  StackOverflow5              2
6   EFG   5A   Z5  StackOverflow6              3
7   GHI   6A   Z5  StackOverflow7              3
8   HIJ <NA>   Z6  StackOverflow8              3
9   IJK   9A   Z7  StackOverflow9              4
10  JKL  10A   Z8 StackOverflow10              5
11  GHI   7A   Z6 StackOverflow11              3
12  KLM  12A   Z8 StackOverflow12              5
13  LMN  13A   Z9 StackOverflow13              6
14  MNO <NA>   Z9 StackOverflow14              6
15  NOP  15A   Z1 StackOverflow15              2

但链接帖子中建议的三种方法不起作用,并给我带来错误。

请提出建议。

推荐答案

附加说明

为了能够对该网络进行集群,我们需要一个ids的边列表。在此数据框中,我们实际上每行都有3ids,表示一种三元组结构,或者通常它显示了这三个元素之间的连接。因此

  • 我首先选择了3个目标变量,然后使用pmap函数在这3个顶点之间创建长度为2的每个组合,并按行将结果绑定在一起
  • 在下一步中,我们得到了一个只有2个变量的数据框,它形成了我们所需的边列表,其中包含了原始顶点(变量)之间的所有现有边]
  • 然后我使用tidyr::drop_na删除那些缺失的值,假设在HIJ --- NA这样的设置中,我们只能定义HIJ的成员资格,如果它与其他观察中的其他顶点之间有任何边。因此,在第一个代码块中删除它们是安全的
  • 最后使用membership函数提取相关组件,并使用groups提取簇。这些集群的id是我们如何提取desired_output变量的地方? 由于每个簇与其他簇是完全分开的,我们假设原始数据集中的每个顶点或id只能是一个簇的一部分,所以我们通过第二个代码块检查了这一点,我只检查了id_1
library(tidyverse)
library(igraph)

df1 %>%
  select(starts_with("id")) %>%
  pmap_dfr(~ as.data.frame(t(combn(c(...), 2)))) %>%
  drop_na() %>%
  graph_from_data_frame(directed = TRUE) %>%
  components() %>% 
  groups() -> lst
  
df1 %>%
  rowwise() %>%
  mutate(grp = seq_len(length(lst))[map_lgl(lst, ~ id_1 %in% .x)])

# A tibble: 15 x 6
# Rowwise: 
   id_1  id_2  id_3  Name            desired_output   grp
   <chr> <chr> <chr> <chr>                    <int> <int>
 1 ABC   1A    Z3    StackOverflow1               1     1
 2 ABC   2A    Z2    StackOverflow2               1     1
 3 BCD   3A    Z1    StackOverflow3               2     2
 4 CDE   1A    Z4    StackOverflow4               1     1
 5 DEF   4A    Z1    StackOverflow5               2     2
 6 EFG   5A    Z5    StackOverflow6               3     3
 7 GHI   6A    Z5    StackOverflow7               3     3
 8 HIJ   NA    Z6    StackOverflow8               3     3
 9 IJK   9A    Z7    StackOverflow9               4     4
10 JKL   10A   Z8    StackOverflow10              5     5
11 GHI   7A    Z6    StackOverflow11              3     3
12 KLM   12A   Z8    StackOverflow12              5     5
13 LMN   13A   Z9    StackOverflow13              6     6
14 MNO   NA    Z9    StackOverflow14              6     6
15 NOP   15A   Z1    StackOverflow15              2     2

这篇关于如何在网络分析中处理空值/Nas的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆