Я пытаюсь сопоставить всех клиентов в наборе данных и дать идентичный идентификатор тем, чей почтовый индекс соответствует 100%, адрес и адрес электронной почты соответствуют 85%. Я смог сделать это, используя Record Linkage package в R. Теперь у меня есть такой результат:

x <- data.frame(ID1=c(1,2, 3, 5, 10, 11, 12), ID2=c(2,5,4,11,11,18,18))

ID1 ID2
1   2
2   5
3   4
5   11
10  11
11  18
12  18

Но я хочу сгруппировать все идентификаторы, которые совпадают, например, 1,2,5,11,10,12,18, все одинаковые, поэтому я хотел бы дать им один и тот же идентификатор.

В основном я хочу вывод, как это:

Group   Key
1        1
1        2
1        5
1       11
1       10
1       12
1       18
3        3
3        4
1
Ankita 11 Апр 2019 в 20:32

2 ответа

Лучший ответ

Я сталкивался с этой проблемой раньше, и мне было интересно, есть ли быстрое решение в R. Если вы пытаетесь найти интервалы, которые группируют строки, это можно сделать с помощью data.table::foverlaps (см. Возможно использовать функцию R data.table, чтобы найти пересечение перекрывающихся диапазонов в двух таблицах? ), но я не знаю, как группировать наборы (а не числовые интервалы) вместе. Вот решение, но это, вероятно, не самый быстрый подход.

    x <- data.frame(ID1=c(1,2, 3, 5, 10, 11, 12), ID2=c(2,5,4,11,11,18,18))


sets <- list()
for(i in 1:nrow(x)){
  temp <- unique(unlist(x[i,]))
  if(length(sets)==0){
    sets[[1]] <- temp
  }else{
    in_sets <- sapply(sets, function(s)any(temp%in%s))  
    if(sum(in_sets)==0){
      sets[[length(sets)+1]] <- temp
    }
    if(sum(in_sets)==1){
      sets[[which(in_sets)]] <- union(sets[[which(in_sets)]],temp)
    }

    if(sum(in_sets)>1){
      sets[[which.min(in_sets)]] <-  union(unlist(sets[in_sets]),temp)
      sets[which(in_sets)[-1] ] <-  NULL
    }

  }

}

do.call("rbind",mapply(sets,1:length(sets),SIMPLIFY=FALSE,FUN=function(x,n){
  data.frame(Group=n,Key=x)
}))
0
Michael 11 Апр 2019 в 19:08

Код ниже дает мне вывод, который я ищу:

X <- data.frame (ID1 = c (1,2, 3, 5, 10, 11, 12), ID2 = c (2,5,4,11,11,18,18)) библиотека (igraph) y = graph.data.frame (x) z = стек (cluster (y) $ членство)

1
Ankita 11 Апр 2019 в 20:09