根据与另一个数据框的(唯一)部分匹配,从数据框中删除行

时间:2020-09-08 11:06:23

标签: r dataframe

我有一个数据框A,其中包含2列-字符串和代码:

String             Code
Bacteria.111       abc1
Bacteria.111       abc2
Bacteria.111       abc3
Archaea.153        gmt1
Archaea.153        gmt2

我还有另一个数据框B,其中包含上面细菌/古细菌后面的数字应该是什么代码的列表:

Number             Code
111                abc2
153                gmt1

我想做的是从数据框A中删除细菌/古细菌后编号不正确的行。所以由此产生的数据框应为:

String             Code
Bacteria.111       abc2
Archaea.153        gmt1

我尝试使用%in%,但这使用完全匹配,因此没有匹配项。我所需要的是匹配数字,该数字始终位于字符串的末尾,并且始终跟随一个句点。我对如何做到这一点迷失了。

2 个答案:

答案 0 :(得分:2)

粘贴列时可以使用%in%,并使用sub删除.之前的所有内容。

A[paste(sub(".*\\.", "", A$String), A$Code) %in% paste(B$Number, B$Code),]
#        String Code
#2 Bacteria.111 abc2
#4  Archaea.153 gmt1

答案 1 :(得分:1)

尝试一下:

A <- A %>%
  mutate(
    Number = as.integer(stringr::str_sub(String, start = stringi::stri_locate_last_fixed(String, ".")[,2] + 1)) # get the code
  ) %>% 
  left_join(B %>% rename(Code2 = Code), by = "Number") %>% # join data frames
  filter(Code == Code2) %>% # compare and filter
  select(-Number, -Code2)