为不同列的重复项创建ID

时间:2018-08-29 14:13:10

标签: python r partitioning

我在这个概念上做了很多尝试,

我有一个data.frame,其列名为3个RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.notification_layout); NotificationCompat.Builder builder = builder .setSmallIcon(R.mipmap.ic_launcher_round) .setCustomBigContentView(contentView) .setOngoing(true); CustnameEmail

Mobile_no

实际上,这些客户属于同一组,因为列中的手机号码和电子邮件是相同的,但是客户名称不同。

我想创建一个唯一的ID,这些ID的移动设备的电子邮件地址与电子邮件列的匹配项相同,而同一电子邮件的移动电话与电话号码列的匹配项。

我通过使用Custname Email Mobile_no aaa xyz@gmail.com 987 bbb xyz@gmail.com 123 ccc xyz0@gmail.com 987 ddd abc@gmail.com 123 eee xyz0@gmail.com 100 duplicated函数进行了很多尝试。

作为补充说明,我不希望paste个客户,实际上987来自两个不同的客户(aaa和CCC),但是两个不同的客户具有不同的电子邮件xyz和xyz。在此邮件中,xyz与客户eee相匹配,因此(aaa ccc eee)都是同一组,就像明智的电子邮件一样。

谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

实际上,您的问题是组件的图形分离。在您的情况下,图的顶点是人。基于属性信息,即电子邮件和电话号码,您可以建立边缘关系。

pasteduplicategroup_by这样的简单方法似乎无效,因为您可能具有相当复杂的路径。正如您所解释的,人 D 和人 E 具有完全不同的联系人,实际上,它们通过人 C 连接,因此应该具有相同的ID。

或者换句话说,有人通过电子邮件 A 和移动电话 B 在网站上退了礼。然后他丢了电话。并在手机 C 中注册。然后他忘记了密码,并在电子邮件 D 中进行了注册。最后,我们得到了电子邮件 D 和手机 C 的人。出于某些未知原因,他以不同的名字注册。

您的关系路径可能更加复杂。

下面的算法使用igraph根据您的条件创建的邻接矩阵来制作无向图。在确定未连接的组件后,将其提取并与初始data.frame合并。由于您的示例中没有足够的数据,因此使用了模拟。

模拟输入:

   name tel    email
1   AAA 222 F@xy.com
2   BBB 555 C@xy.com
3   CCC 333 E@xy.com
4   DDD 666 D@xy.com
5   EEE 666 A@xy.com
6   FFF 111 F@xy.com
7   GGG 444 B@xy.com
8   HHH 666 A@xy.com
9   III 444 B@xy.com
10  JJJ 333 F@xy.com

代码

library(igraph)
set.seed(123)
n <- 10

# simulation
df <- data.frame(
  name = sapply(1:n, function(i) paste0(rep(LETTERS[i], 3), collapse = "")),
  tel = sample(1:6, n, replace = TRUE) * 111,
  email = paste0(sample(LETTERS[1:6], n, replace = TRUE), "@xy.com")
)

# adjacency matrix preparation
df1 <- expand.grid(df$name, df$name)
names(df1) <- c("name_x", "name_y")

df1 <- merge(df1, df, by.x = "name_x", by.y = "name")
df1 <- merge(df1, df, by.x = "name_y", by.y = "name")
df1$con <- ifelse(with(df1, tel.x == tel.y | email.x == email.y), 1, 0)

stats::reshape(df1[, c(1, 2, 7)], idvar = "name_x", timevar = "con", direction = "wide")
#v.names = , timevar = "numbers", direction = "wide")
library(igraph)


library(reshape2)
m <- dcast(df1[, c(1, 2, 7)], name_y ~ name_x)
rownames(m) <- m[, 1]
m[, 1] <- NULL
m <- as.matrix(m) 
diag(m) <- 0

# graph creation
g1 <- graph_from_adjacency_matrix(m, mode = "undirected")
gcmps <- groups(components(g1))

# groups extraction
ids <- unlist(mapply(function(x, y) paste0(x, "_", y), seq_along(gcmps), gcmps))
df_ids <- as.data.frame(t(sapply(ids, function(x) unlist(strsplit(x, "_")))))
names(df_ids) <- c("id", "name")

# data merging
result <- merge(df, df_ids)
result

输出:

   name tel    email
1   AAA 222 F@xy.com
2   BBB 555 C@xy.com
3   CCC 333 E@xy.com
4   DDD 666 D@xy.com
5   EEE 666 A@xy.com
6   FFF 111 F@xy.com
7   GGG 444 B@xy.com
8   HHH 666 A@xy.com
9   III 444 B@xy.com
10  JJJ 333 F@xy.com

关系图(仅使用名字的第一个字母) graph