r - 我可以在没有 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
替换的数据框:text
revised
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 应用程序来说它太慢了。
解决方案
仅使用基础 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
。
推荐阅读
- android - 如何限制在 Firebase 实时 Android Studio 上检索数据
- node.js - 无法安装浪涌
- mongodb - Docker 崩溃并丢失了数据
- javascript - 如何将一个对象复制到另一个变量而不在javascript中传递引用
- c# - 如何在 C# 中将日期转换为字符串格式到日期格式?
- javascript - 如何在点击时使用 jquery 填充输入
- php - 使用客户端哈希创建登录系统
- java - 为什么覆盖等于不适用于在 Map 中添加相同的对象?
- android - 我发布的应用未在 Google Play 商店中显示
- postgresql - 如何在多阶段 Docker 容器中构建 Postgres jsonlog