R查找忽略NA的元组组

问题描述

基于 almost identical question,我试图根据几列创建唯一的,如果“存在通过列的任意组合的路径”,则行应分组到相同的 ID 中。不同之处在于我有不应该用于链接行的 NA:

目标是让 R 基于 id3id1 创建 id2,最小示例:

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

library(igraph)
df = data.frame(id1 = c(1,1,2,3,4,5,6,NA,NA),id2 = c('a','a','c','d','x','y','z',id3 = c(rep('group1',6),rep('group2',NA))

我的解决方NA 值而失败。

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

观察(行)2 和 8 是链接的,因为它们都有 NA 对应 id2,但这应该被忽略。有没有办法

解决方法

您可以尝试使用以下代码

  • components + memberships + merge
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
)

  • decompose + merge
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>