根据多列中的几种组合删除行

时间:2019-02-07 01:49:31

标签: r

在R中,我需要从2个字符列中删除具有多个组合的行。我一直在寻找解决方案,但是大多数问题要么处理重复项,要么仅尝试删除1个组合,而不是基于两列的多个组合。这是df的示例:

Species   Harvest  Hunt.Type
Sheep       1         Gun
Goat        4         Bow
Turkey      3         Gun
Pig         2         Bow
Quail       6         Bow

在这里,我需要删除所有具有Hunt.Type中带有“ Gun”的哺乳动物物种的行,以及任何一行具有“ Bow” Hunt.Type的鸟类物种的行。所以我想结束这个:

Species   Harvest  Hunt.Type
Goat        4         Bow
Turkey      3         Gun
Pig         2         Bow

我的数据框比这大得多,有13种,并且列和行更多。

我尝试使用基于r和dplyr的条件下的提取物来执行此操作,但由于物种的多种组合增加了复杂性,我无法弄清楚。

我在基本r中尝试了类似的方法:

df[df$Species== c("Goat" , "Sheep", "Pig") & 
       df$Hunt.Type == "Gun",]

但是由于某种原因,代码会忽略那些条件的某些行,而保留其他条件。对于dplyr,我什至无法得到任何东西。

1 个答案:

答案 0 :(得分:0)

是的,我建议创建一个包含所有鸟类或哺乳动物(以较短者为准)的载体,然后进行过滤。我们只需要其中一个,因为另一半只是它们的补充。因此,假设Species不是鸟类,那就是哺乳动物,反之亦然。

因此,在此示例中,我们可以做到

bird.keywords <- c("Turkey", "Quail")
df[!with(df, (Species %in% bird.keywords & Hunt.Type == "Bow") | 
             (!Species %in% bird.keywords) & Hunt.Type == "Gun"),]


#  Species Harvest Hunt.Type
#2    Goat       4       Bow
#3  Turkey       3       Gun
#4     Pig       2       Bow