связующие группы дубликатов - PullRequest
0 голосов
/ 03 июля 2018

У меня есть некоторые данные, которые имеют много дубликатов. Например, этот кадр данных показывает идентификаторы в наборе данных, которые, как известно, идентичны (например, строка 1 указывает a = b, поэтому остальные данные указывают, что a = b = c и d = e = f):

a <- c('a','a','b','b','c','c','d','d','e','e','f','f')
b <- c('b','c','a','c','a','b','e','f','d','f','d','e')
duplicates <- cbind(a,b)

Существует ли какой-либо простой способ разделить их на две группы, которые являются истинными идентификаторами (например, здесь a, b и c одинаковы, а d, e & f также одинаковы). Итак, для моих образцов данных:

a <- c('a','b','c','d','e','f')
b <- c('c1','c1','c1','c2','c2','c2')
new_id <- cbind(a,b)

Фактические данные имеют тысячи строк и не полностью связаны (то есть в кластере дубликатов это может произойти: a = b, a = c, b = / = c) из-за некоторых ошибок при обнаружении дубликатов.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Похоже, вы смотрите на анализ сети. Есть несколько пакетов, которые занимаются этим. Таким образом, вы можете использовать тот, который вам наиболее знаком (сеть, тидиграф, igraph ,grammeR). Я использую igraph, потому что знаю, что один немного больше, чем другие.

Шаги:

Сначала создайте график из данных, используя dup data.frame. Затем используйте функцию clusters (или один из других параметров кластера) для создания кластеров на основе данных. Последний шаг - преобразовать кластеры в data.frame. Кроме того, вы можете построить данные (зависит от того, сколько у вас данных).

library(igraph)
g <- graph_from_data_frame(dup, directed = FALSE)

clust <- clusters(g)

clusters <- data.frame(name = names(clust$membership), 
                       cluster = clust$membership,
                       row.names = NULL,
                       stringsAsFactors = FALSE)

clusters
  name cluster
1    a       1
2    b       1
3    c       1
4    d       2
5    e       2
6    f       2

# plot graph if needed
plot(g)

enter image description here

данные:

a <- c('a','a','b','b','c','c','d','d','e','e','f','f')
b <- c('b','c','a','c','a','b','e','f','d','f','d','e')
dup <- data.frame(a,b, stringsAsFactors = FALSE)
0 голосов
/ 03 июля 2018

Вы можете работать с факторами.

df.1$id <- with(df.1, ifelse(as.numeric(a) %in% 1:3, "c1", "c2"))
new_id <- unique(df.1[, -2])
rownames(new_id) <- NULL  # just in case

Уступая

> new_id
   a id
1  a c1
2  b c1
3  c c1
4  d c2
5  e c2
6  f c2

Данные

a <- c('a','a','b','b','c','c','d','d','e','e','f','f')
b <- c('b','c','a','c','a','b','e','f','d','f','d','e')

df.1 <- data.frame(a, b)
...