【问题标题】:Removing rows from a dataframe based on (exclusive) partial match to another dataframe基于(独占)部分匹配从数据帧中删除行到另一个数据帧
【发布时间】:2020-09-08 19:28:11
【问题描述】:

我有一个数据框 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% ,但这使用了完全匹配,所以没有匹配项。我所需要的只是匹配始终位于字符串末尾并始终跟随句点的数字。我不知道如何做到这一点。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您可以在粘贴列时使用%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
    

    【讨论】:

    • 细菌只是一个占位符 - 数字前的实际名称因所有代码而异。
    • 好的,你必须删除它。我使用sub 进行了更新以删除. 之前的所有内容。
    • 有没有什么办法不经期前去掉?这将使数据点难以处理。
    • 它仅在比较过程中被删除,但保留A中的所有内容。
    【解决方案2】:

    试试这个:

    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)
    

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多