对于这个问题,我会很高兴在 R(理想情况下使用 dplyr 但其他方法也可以)或纯 SQL 中的解决方案。
我有由个人 ( ID
) 和电子邮件地址组成的数据,以及一个表示电子邮件地址是否是个人主要电子邮件地址 (1) 或不是 (0) 的二进制指示符
ID
s 有一个且只有一个主电子邮件地址 ID
s 可以有多个非主电子邮件地址(或没有)ID
s 可以与主要和非主要电子邮件地址相同 例如:
ID Email Primary
1 1 A 1
2 1 A 0
3 1 B 0
4 2 A 1
5 2 A 0
6 3 C 1
7 4 D 1
8 4 C 0
9 5 E 1
10 5 F 0
(实际数据集大约有一百万行)我希望识别电子邮件地址不是主要的 ID,但对于不同的 ID 是主要的。也就是说,我想选择以下行:
因此,在上面的数据中,我想选择第 5 行(因为电子邮件地址是非主要的,但主要在第 1 行用于不同的
ID
和第 8 行(因为它是非主要的,但主要在第 6 行用于不同的 ID
) 和第 2 行对于 R 用户,这是上面的玩具数据框:
structure(list(ID = c(1, 1, 1, 2, 2, 3, 4, 4, 5, 5), Email = c("A", "A", "B", "A", "A", "C", "D", "C", "E", "F"), Primary = c(1, 0, 0, 1, 0, 1, 1, 0, 1, 0)), class = "data.frame", row.names = c(NA, -10L))
最佳答案
您可以选择行
Primary = 0
ID
就是这样 Email
大于 1。primary = 1
为此Email
使用
dplyr
,你可以这样做:library(dplyr)
df %>%
group_by(Email) %>%
filter(Primary == 0, n_distinct(ID) > 1, any(Primary == 1))
# ID Email Primary
# <dbl> <chr> <dbl>
#1 1 A 0
#2 2 A 0
#3 4 C 0
既然你有大数据 data.table
解决方案会有所帮助:library(data.table)
setDT(df)[, .SD[Primary == 0 & uniqueN(ID) > 1 & any(Primary == 1)], Email]
关于sql - 根据其他行中列的值选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64168228/