我有一个数据框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%,但这使用完全匹配,因此没有匹配项。我所需要的是匹配数字,该数字始终位于字符串的末尾,并且始终跟随一个句点。我对如何做到这一点迷失了。
答案 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)