我有以下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)应视为不可比较(或上述所有内容都在同一组中).
以下是查找图表组件的解决方案:
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)