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