如果value与在r中有条件删除的值匹配,则删除行

时间:2019-07-16 15:51:34

标签: r dataframe conditional-statements

我有一个数据框。我正在尝试删除具有与其他有条件删除的行相匹配的列中的值的行。让我提供一个简单的例子来更好地解释。

我尝试使用上一篇文章作为起点: Remove Rows From Data Frame where a Row match a String

>dat
A,B,C
4,3,Foo 
2,3,Bar
1,2,Bar
7,5,Zap

首先删除C列中带有“ Foo”的行:

dat[!grepl("Foo", dat$C),]

现在,我想删除B列中具有与Foo中的值相匹配的值的所有其他行。因此,在此示例中,所有B = 3的行都将被删除,因为第一行的Foo已被删除,并且B = 3。

>dat.new
1,2,Bar
7,5,Zap

任何有关如何执行此操作的想法将不胜感激。

1 个答案:

答案 0 :(得分:2)

我们将'C'为'Foo'的'B'值子集化,通过检查'B'中的值创建逻辑矢量,取反(!),并创建一个条件,其中'C '不是“ Foo”

library(dplyr)
dat.new <- dat %>%
              filter(!B %in% B[C == 'Foo'], C != 'Foo')
dat.new
#  A B   C
#1 1 2 Bar
#2 7 5 Zap

或在base R中与subset

subset(dat, !B %in% B[C == 'Foo'] & C != "Foo")

数据

dat <- structure(list(A = c(4L, 2L, 1L, 7L), B = c(3L, 3L, 2L, 5L), 
    C = c("Foo", "Bar", "Bar", "Zap")), row.names = c(NA, -4L
), class = "data.frame")