我在这个概念上做了很多尝试,
我有一个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);
,Custname
,Email
:
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)都是同一组,就像明智的电子邮件一样。
谢谢您的帮助
答案 0 :(得分:0)
实际上,您的问题是组件的图形分离。在您的情况下,图的顶点是人。基于属性信息,即电子邮件和电话号码,您可以建立边缘关系。
像paste
或duplicate
或group_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