根据其他行中列的值选择行
Selecting rows based on the value of columns in other rows
对于这个问题,我很乐意在 R 中找到解决方案(最好使用 dplyr,但其他方法也可以)或纯 SQL.
我有由个人 (ID
) 和电子邮件地址组成的数据,以及一个二进制指示符,表示电子邮件地址是个人的主要电子邮件地址 (1) 还是 (0)
- 所有
ID
都有一个且只有一个主电子邮件地址
ID
s 可以有多个非主要电子邮件地址(或 none)
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。也就是说,我想要 select 行,其中:
- 主要是 0
- 存在另一行,其中该 ID 是主 ID,但 ID 不同
因此在上面的数据中,我想 select 第 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))
在SQL中,你可以使用exists
:
select t.*
from mytable t
where t.primary = 0
and exists (
select 1
from mytable t1
where t1.email = t.email
and t1.id <> t.id
and t1.primary = 1
)
您可以 select 行,其中
Primary = 0
Email
的 ID
数量大于 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]
对于这个问题,我很乐意在 R 中找到解决方案(最好使用 dplyr,但其他方法也可以)或纯 SQL.
我有由个人 (ID
) 和电子邮件地址组成的数据,以及一个二进制指示符,表示电子邮件地址是个人的主要电子邮件地址 (1) 还是 (0)
- 所有
ID
都有一个且只有一个主电子邮件地址 ID
s 可以有多个非主要电子邮件地址(或 none)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。也就是说,我想要 select 行,其中:
- 主要是 0
- 存在另一行,其中该 ID 是主 ID,但 ID 不同
因此在上面的数据中,我想 select 第 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))
在SQL中,你可以使用exists
:
select t.*
from mytable t
where t.primary = 0
and exists (
select 1
from mytable t1
where t1.email = t.email
and t1.id <> t.id
and t1.primary = 1
)
您可以 select 行,其中
Primary = 0
Email
的ID
数量大于 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]