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