连接重复的组

时间:2018-07-03 07:32:20

标签: r dplyr tidyr tidyverse

我有一些重复的数据。例如,此数据帧显示数据集中已知相同的ID(例如,row1表示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)

是否有任何简单的方法可以将它们分为真实ID的两组(例如,此处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 :(得分:3)

听起来就像您在进行网络分析。有一些软件包可以解决这个问题。因此,您可能想使用最熟悉的一种(网络,tidygraph,igraph,diagrammeR)。我使用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)

答案 1 :(得分:1)

您可以处理各种因素。

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)