Home > OS >  Remove rows in one dataframe if they are present in another dataframe
Remove rows in one dataframe if they are present in another dataframe

Time:04-26

I have a dataframe that looks like this:

structure(list(ASV = c("ASV1", "ASV2", "ASV3", "ASV4", "ASV5", 
"ASV6", "ASV7", "ASV8", "ASV9", "ASV10", "ASV11", "ASV12", "ASV13", 
"ASV14", "ASV15", "ASV16", "ASV17", "ASV18", "ASV19", "ASV20", 
"ASV21", "ASV22", "ASV23", "ASV24", "ASV25", "ASV26", "ASV27", 
"ASV28", "ASV29", "ASV30", "ASV31", "ASV32", "ASV33", "ASV34", 
"ASV35", "ASV36", "ASV37", "ASV38", "ASV39", "ASV40", "ASV41", 
"ASV42", "ASV43", "ASV44", "ASV45", "ASV46", "ASV47", "ASV48", 
"ASV49", "ASV50", "ASV51", "ASV52", "ASV53", "ASV54", "ASV55", 
"ASV56", "ASV57", "ASV58", "ASV59", "ASV60", "ASV61", "ASV62", 
"ASV63", "ASV64", "ASV65", "ASV66", "ASV67", "ASV68", "ASV69", 
"ASV70", "ASV71", "ASV72", "ASV73", "ASV74", "ASV75", "ASV76", 
"ASV77", "ASV78", "ASV79", "ASV80", "ASV81", "ASV82", "ASV83", 
"ASV84", "ASV85", "ASV86", "ASV87", "ASV88", "ASV89", "ASV90", 
"ASV91", "ASV92", "ASV93", "ASV94", "ASV95", "ASV96", "ASV97", 
"ASV98", "ASV99", "ASV100", "ASV101", "ASV102", "ASV103", "ASV104", 
"ASV105", "ASV106", "ASV107", "ASV108", "ASV109", "ASV110", "ASV111", 
"ASV112", "ASV113", "ASV114", "ASV115", "ASV116", "ASV117", "ASV118", 
"ASV119", "ASV120", "ASV121", "ASV122", "ASV123", "ASV124", "ASV125"
), Domain = c("Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Archaea", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", "Bacteria", 
"Bacteria"), Phylum = c("Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Abditibacteriota", 
"Abditibacteriota", "Abditibacteriota", "Abditibacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota", "Acidobacteriota", 
"Acidobacteriota", "Acidobacteriota", "Acidobacteriota")), class = "data.frame", row.names = c(NA, 
-125L))

and I want to remove the rows that have an ASV number present in this dataframe:

structure(list(ASV = c("ASV4", "ASV46", "ASV65", "ASV74", "ASV110", 
                       "ASV125")), class = "data.frame", row.names = c(NA, -6L))

So, for example, ASV4 is in the second dataframe, so I want to remove the whole row corresponding to ASV4 in the first dataframe.

Is there a simple way to do this so I don't have to go manually one-by-one?

CodePudding user response:

In Base R

df[-match(df2$ASV, df$ASV),]

or even

 dplyr::anti_join(df, df2)

CodePudding user response:

We can use filter and remove the rows that contain the ASV values in df2.

library(dplyr)

df %>% 
  filter(!ASV %in% df2$ASV)

Or in base R:

df[!df$ASV %in% df2$ASV, ]

Test

So, it removes the 6 rows that contained the values from df2.

nrow(df)
# [1] 125

nrow(df2)
# [1] 6

nrow(df[!df$ASV %in% df2$ASV, ])
# [1] 119

Or another option with data.table:

library(data.table)

setDT(df)[!setDT(df2), on = "ASV"]

CodePudding user response:

Conceptually, this is called an anti-join (related to set difference). You can do it with dplyr:

library(dplyr)

filtered = anti_join(all_ids, bad_ids, on="ASV")
  •  Tags:  
  • r
  • Related