首页 > 解决方案 > 我可以在没有 for 循环的情况下在 R 中进行矢量文本搜索吗?

问题描述

我有两个数据集。一个具有附加到识别数据的文本键的冗长组合:

set.seed(123)
library(tidyverse)

id <- paste0("V", sample((1000:9999), size = 5))
text <- c("ARROW", "ARROWHEAD", "OTHERARROW", "OTHER", "HEADOTHER")

df <- tibble(id, text)
df

  id    text      
  <chr> <chr>     
1 V3588 ARROW     
2 V8093 ARROWHEAD 
3 V4679 OTHERARROW
4 V8944 OTHER     
5 V9460 HEADOTHER 

另一个查找这些键并为其分配较短的值:

original <- c("ARROW", "HEAD", "OTHER")
revised <- c("A", "H", "O")

lookup <- tibble(original, revised)
lookup

  original revised
  <chr>    <chr>  
1 ARROW    A      
2 HEAD     H      
3 OTHER    O  

我想要的输出是 make ,一个用代码组合df1替换的数据框:textrevised

correctText <- c("A", "AH", "AO", "O", "HO")

df1 <- tibble(id, correctText)
df1

  id    correctText
  <chr> <chr>      
1 V3588 A          
2 V8093 AH         
3 V4679 AO         
4 V8944 O          
5 V9460 HO  

执行此操作的最有效方法是什么(仅基于 R 或 dplyr)?现在我正在用一个for循环来做这件事,但是对于我想要实现它的 Shiny 应用程序来说它太慢了。

标签: rdplyr

解决方案


仅使用基础 R(并且dplyr,由于您使用 tibble,所以我mutate也加入了),您可以使用此功能:

multisub <- function(target, output, string) {
  replacement.list <- apply(cbind(target, output), 1, as.list)
  mygsub <- function(l, x) gsub(pattern = l[1], replacement = l[2], x, perl=TRUE)
  Reduce(mygsub, replacement.list, init = string, right = TRUE)
}

df %>% mutate(text = multisub(original, revised, text))
#> # A tibble: 5 x 2
#>   id    text 
#>   <chr> <chr>
#> 1 V3462 A    
#> 2 V3510 AH   
#> 3 V9717 OA   
#> 4 V3985 O    
#> 5 V2841 HO

# base R oly:
data.frame(id=id, text = multisub(original, revised, text), stringsAsFactors = FALSE)

在性能方面,它与解决方案相当具有竞争力stringr


推荐阅读