簡體   English   中英

根據其他行中列的值選擇行

[英]Selecting rows based on the value of columns in other rows

對於這個問題,我會很高興在 R(理想情況下使用 dplyr 但其他方法也可以)或純 SQL 中的解決方案。

我有由個人 ( ID ) 和電子郵件地址組成的數據,以及一個表示電子郵件地址是否是個人的主要電子郵件地址 (1) 或不是 (0) 的二進制指示符

  • 所有ID都有一個且只有一個主要電子郵件地址
  • ID可以有多個非主電子郵件地址(或沒有)
  • ID可以與主要和非主要具有相同的電子郵件地址

例如:

   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 是主要的。 也就是說,我想選擇以下行:

  • 主要是 0
  • 存在另一行,其中該 ID 是主要的,但用於不同的 ID

因此,在上面的數據中,我想選擇第 5 行(因為電子郵件地址是非主要的,但主要在第 1 行表示不同的ID和第 8 行(因為它是非主要的,但主要在第 6 行表示不同的ID 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
  • EmailID數大於 1。
  • Email至少有一個primary = 1

使用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 中,您可以使用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
                  )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM