KNN
KNN

Reputation: 535

remove rows if value matches that which was conditionally remove in r

I have a data frame. I'm trying to remove rows that have values in a column that match other rows that were conditionally removed. Let me provide a simple example for better explaining.

I'm tried using the previous post as a starting point: 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

First remove rows with "Foo" in column C:

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

Now I want to remove any additional rows that have values in column B that match the values in rows with Foo. So in this example, any rows with B = 3 would be removed because row 1 has Foo, which was removed and has B=3.

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

Any ideas on how to do this would be appreciated.

Upvotes: 1

Views: 474

Answers (1)

akrun
akrun

Reputation: 887881

We subset the 'B' values where 'C' is 'Foo', create a logical vector by checking those values in the 'B', negate (!) and also create a condition where the 'C' is not "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

Or in base R with subset

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

data

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")

Upvotes: 2

Related Questions