根据其他行中列的值选择行

Joe*_*ing 4 sql r subquery where-clause dplyr

对于这个问题,我会很高兴在 R(理想情况下使用 dplyr,但其他方法也可以)或纯 SQL 中的解决方案。

我有由个人 ( ID) 和电子邮件地址组成的数据,以及一个表示电子邮件地址是否是个人主要电子邮件地址 (1) 或不是 (0) 的二进制指示符

  • 所有IDs 都有一个且只有一个主电子邮件地址
  • IDs 可以有多个非主电子邮件地址(或没有)
  • IDs 可以与主要和非主要的电子邮件地址相同

例如:

   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
Run Code Online (Sandbox Code Playgroud)

(实际数据集大约有一百万行)

我希望识别电子邮件地址不是主要的 ID,但对于不同的 ID 是主要的。也就是说,我想选择以下行:

  • 主要是 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))
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 5

您可以选择行

  • Primary = 0
  • 的数目ID的为Email大于1。
  • 有ATLEAST一个primary = 1Email

使用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
Run Code Online (Sandbox Code Playgroud)

由于您拥有大数据,因此data.table解决方案会有所帮助:

library(data.table)

setDT(df)[, .SD[Primary == 0 & uniqueN(ID) > 1 & any(Primary == 1)], Email]
Run Code Online (Sandbox Code Playgroud)