如何过滤多个条件

时间:2019-04-25 14:07:55

标签: r dplyr filtering

我正在尝试按国家和立法选举对数据框进行排序-第一步可以复制多个不同的政党家庭。

到目前为止,我所做的是将主要数据集分为党派(parfam =='10'),“最近”选举(date>'201000'),并排除了没有相关数据的国家(!country%in %nodata,nodata是我已经创建的值的列表):

eco <- filter(CMPdataset, parfam == '10' & date > '201000' & ! country %in% nodata)

由于某些国家/地区在2010年之后的时间段内将多个选举编码到总体数据集CMPdataset中,因此我手动检查了数据并使用以下方法手动消除了所有不必要的数据:

eco <- eco[-c(1,8,10,11,13,14,18,20,21,22,23,27,28,31,32,34,35,37), ]

如您所见,这对于较大的数据帧可能非常繁琐。因此,我想我要结合我所知道的公式,得出以下结论(edate是具有特定选举日期的变量,格式为YYYY-MM-DD,我列出了我在名称下包含的所有特定选举的清单included_elections):

eco2 <- filter(CMPdataset, parfam == '10' & ! country %in% nodata & edate %in% included_elections)

但是,这没有任何结果,我也不知道为什么!我可以坚持手工完成所有操作,但是这很繁琐且不容易复制,这就是为什么我真的更喜欢这样的解决方案的原因。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

CMPdataset %>% group_by(country) %>% 
filter(parfam==`10`, !country %in% nodata, date==max(edate), date>201000)

date==max(date)将过滤数据框,以便在每个组(即国家/地区)内,仅保留最近一次选举的行。 (同样,条件之间不需要&,默认情况下,&将它们全部加入)。

答案 1 :(得分:0)

感谢您提供dput输出。立即发生错误的原因是您需要将included_elections转换为日期格式:

included_elections <- as.Date(included_elections)

也就是说,按照@iod的方法,结合您想要的条件(例如,当您希望进行上次选举时以及当您希望进行倒数第二次选举时)的更系统的方法是更好的长期解决方案