在共享公共列中分配groupid

Kha*_*nes 4 r data.table

我有以下data.frame(实际上它是数百万条记录).

我希望能够在电话号码与任何其他记录和任何电话号码位置匹配时分配组ID.

id <- c(1:5)
phone_1 <- c("444","", "333", "222", "")
phone_2 <- c("", "444", "111", "", "")
phone_3 <- c("222","", "", "", "111")
df <- data.frame(id, phone_1, phone_2, phone_3)
Run Code Online (Sandbox Code Playgroud)

理想的输出如下:

print(df)
#   id phone_1 phone_2 phone_3  ID
# 1  1     444             222  1
# 2  2             444          1
# 3  3     333     111          2
# 4  4     222                  1
# 5  5                     111  2
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想使用一种data.table方法,因为速度很重要.

请注意,缺失值(""NA)应视为不可比较(或上述所有内容都在同一组中).

Aur*_*èle 5

以下是查找图表组件的解决方案:

library(tidyr)
library(dplyr)
library(igraph)

df$id <- paste0("id-", df$id)

graph <- 
  df %>%
  gather(dummy, phone, -id) %>% 
  select(-dummy) %>% 
  filter(!is.na(phone) & phone != "") %>% 
  as.matrix() %>% 
  graph_from_edgelist(directed = FALSE)

plot(graph)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

df$ID <- components(graph)$membership[df$id]

df

#     id phone_1 phone_2 phone_3 ID
# 1 id-1     444             222  1
# 2 id-2             444          1
# 3 id-3     333     111          2
# 4 id-4     222                  1
# 5 id-5                     111  2
Run Code Online (Sandbox Code Playgroud)