2017-08-13 130 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')))