2017-08-13 131 views
1

我想根據多列中的值刪除我的數據集中的特定行。只有滿足所有3列中的條件時才應刪除行。使用dplyr刪除基於多個條件的行

這是我的代碼:

test_dff %>% 
    filter(contbr_nm != c('GAITHER, BARBARA', 'PANIC, RADIVOJE', 'KHAN, RAMYA') & 
      contbr_city != c('APO AE', 'PORSGRUNN', 'NEW YORK') & 
      contbr_zip != c('9309', '3924', '2586')) 

此代碼應該刪除我的表12行。相反,它消除了絕大多數。我懷疑,它會刪除所有可能的行,只要滿足其中一個條件。

有沒有更好的解決方案,還是我必須使用的方法,描述here

我是否需要分別指定每個組合?像這樣?這種方法也會刪除太多的行,所以它也是錯誤的。

test_dff %>% 
    filter((contbr_nm != 'GAITHER, BARBARA' & contbr_city != 'APO AE' & contbr_zip != '9309') & 
     (contbr_nm != 'PANIC, RADIVOJE' & contbr_city != 'PORSGRUNN' & contbr_zip != '3924') & 
      (contbr_nm != 'KHAN, RAMYA' & contbr_city != 'NEW YORK' & contbr_zip != '2586')) 

如果我專注於刪除行只基於一個變量,這段代碼的工作原理:

test_dff %>% 
    filter(contbr_zip != c('9309')) %>% 
    filter(contbr_zip != c('3924')) %>% 
    filter(contbr_zip != c('2586')) 

爲什麼這樣的做法行不通?

test_dff %>% 
    filter(contbr_zip != c('9309','3924','2586')) 

非常感謝您的幫助。

+0

請提供可重複的數據集,還包括你想要的輸出中。目前還不完全清楚你想要做什麼。 – lmo

+0

感謝您的留言,並抱歉沒有提供更多信息。我從紐約州http://classic.fec.gov/disclosurep/pnational.do下載了美國總統競選捐款(2016年)的數據集。我正在嘗試清理所有非有效郵政編碼的數據集。我想刪除符合我的代碼中提到的3列的特定行。 – Trgovec

+6

也許你在'%in%'之後? –

回答

1

這是基於連接的方法 - 所有項目必須完全匹配。

main <- read.csv(text = " 
id,name,city,zip 
1,mary,new york,10017 
2,jonah,new york,10016 
3,tamil,manhattan,10019 
4,vijay,harlem,10028 
") 

excludes <- read.csv(text = " 
name,city,zip 
jonah,new york,10016 
vijay,harlem,10028 
") 

library(dplyr) 
anti_join(main, excludes) 

# id name  city zip 
# 1 3 tamil manhattan 10019 
# 2 1 mary new york 10017 
1

調整你的第二個問題(未測試)

test_dff %>% 
    filter(!((contbr_nm == 'GAITHER, BARBARA' & contbr_city == 'APO AE' & contbr_zip == '9309') | 
      (contbr_nm == 'PANIC, RADIVOJE' & contbr_city == 'PORSGRUNN' & contbr_zip == '3924') | 
      (contbr_nm == 'KHAN, RAMYA' & contbr_city == 'NEW YORK' & contbr_zip == '2586')))