R查找忽略NAs的元组组组

R查找忽略NAs的元组组组,r,igraph,R,Igraph,基于,我试图基于多个列创建unique,如果“存在通过任何列组合的路径”,则行应分组到相同的ID中。不同之处在于,我的NAs不应用于链接行: R的目标是基于id1和id2创建id3,最简单的例子是: 例如,id1=1与id2的a和b相关。但是id1=2也与a相关,因此两者都属于一个组(id3=group1)。但由于id1=2和id1=3共享id2=c,因此id1=3也属于该组(id3=1)。元组((1,2),('a','b','c'))的值在其他任何地方都不会出现,因此没有其他行属于该组(通常标

基于,我试图基于多个列创建unique,如果“存在通过任何列组合的路径”,则行应分组到相同的ID中。不同之处在于,我的NAs不应用于链接行:

R的目标是基于
id1
id2
创建
id3
,最简单的例子是:

例如,
id1=1
id2
a
b
相关。但是
id1=2
也与
a
相关,因此两者都属于一个组(
id3=group1
)。但由于
id1=2
id1=3
共享
id2=c
,因此
id1=3
也属于该组(
id3=1
)。元组
((1,2),('a','b','c'))
的值在其他任何地方都不会出现,因此没有其他行属于该组(通常标记为
group1

我的解决方案
NA
值而失败

g <- graph_from_data_frame(df, FALSE)
cg <- clusters(g)$membership
df$id4 <- cg[df$id1]
df

g您可以使用

  • 组件
    +
    成员资格
    +
    合并
这给了你

   id1  id2    id3
1    1    a group1
2    1 <NA> group1
3    2    a group1
4    2    c group1
5    3    c group1
6    3    d group1
7    4    x group2
8    4 <NA> group2
9    5    y group2
10   5    z group2
11   6    x group2
12   6    z group2
13  NA <NA>   <NA>
14  NA <NA>   <NA>
id1 id2 id3
1 a组1
2 1组1
3 2 a组1
4 2 c组1
5 3 c组1
6三维组1
7 4 x组2
8 4组2
9.5 y组2
10 5 z组2
11 6 x组2
12 6 z组2
13 NA
14 NA
g <- graph_from_data_frame(na.omit(df))
merge(
  df,
  transform(
    rev(stack(membership(components(g))[V(g)[names(V(g)) %in% df$id1]])),
    values = paste0("group", values)
  ),
  by.x = "id1",
  by.y = "ind",
  all = TRUE
)
subg <- decompose(graph_from_data_frame(na.omit(df)))
merge(df,
  do.call(
    rbind,
    Map(
      function(x, y) cbind(setNames(unique(as_data_frame(x)[1]), "id1"), id3 = y),
      subg,
      paste0("group", seq_along(subg))
    )
  ),
  by = "id1",
  all = TRUE
)
   id1  id2    id3
1    1    a group1
2    1 <NA> group1
3    2    a group1
4    2    c group1
5    3    c group1
6    3    d group1
7    4    x group2
8    4 <NA> group2
9    5    y group2
10   5    z group2
11   6    x group2
12   6    z group2
13  NA <NA>   <NA>
14  NA <NA>   <NA>