首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于与另一个数据帧的(独占)部分匹配从数据帧中删除行

基于与另一个数据帧的(独占)部分匹配从数据帧中删除行
EN

Stack Overflow用户
提问于 2020-09-08 19:06:24
回答 2查看 29关注 0票数 1

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

代码语言:javascript
复制
String             Code
Bacteria.111       abc1
Bacteria.111       abc2
Bacteria.111       abc3
Archaea.153        gmt1
Archaea.153        gmt2

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

代码语言:javascript
复制
Number             Code
111                abc2
153                gmt1

我正在尝试做的是从数据帧A中删除在细菌/古生菌之后具有错误的数字代码的行。因此,例如,由此产生的数据帧应为:

代码语言:javascript
复制
String             Code
Bacteria.111       abc2
Archaea.153        gmt1

我尝试过在%中使用%,但这里使用的是精确匹配,所以没有匹配。我所需要的就是匹配一个数字,这个数字总是在字符串的末尾,并且总是跟在一个句点后面。我对如何实现这一点感到迷惑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-08 19:12:00

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

代码语言:javascript
复制
A[paste(sub(".*\\.", "", A$String), A$Code) %in% paste(B$Number, B$Code),]
#        String Code
#2 Bacteria.111 abc2
#4  Archaea.153 gmt1
票数 2
EN

Stack Overflow用户

发布于 2020-09-08 19:19:45

试试这个:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63792617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档