如何在网络分析中处理空值/Nas [英] How to handle null values /NAs in network analysis
本文介绍了如何在网络分析中处理空值/Nas的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何在这些类型的情况下处理空值/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
但链接帖子中建议的三种方法不起作用,并给我带来错误。
请提出建议。
推荐答案
附加说明
为了能够对该网络进行集群,我们需要一个id
s的边列表。在此数据框中,我们实际上每行都有3id
s,表示一种三元组结构,或者通常它显示了这三个元素之间的连接。因此
- 我首先选择了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屋!
查看全文