R grepl:快速将多个字符串与多个子字符串匹配,返回所有匹配项

2024-03-13

我在 R 中有相当大的字符串集:

set.seed(42)
strings <- sapply(1:250000, function(x) sample(2:20, 1, prob=c(
  0.001, 0.006, 0.021, 0.043, 0.075, 0.101, 0.127, 
  0.138, 0.132, 0.111, 0.087, 0.064, 0.042, 0.025, 0.014, 0.008, 
  0.004, 0.002, 0.001)))
strings <- lapply(strings, function(x) sample(letters, x, replace=TRUE))
strings <- sapply(strings, paste, collapse='')

我想创建一个列表,表示这些字符串中的子字符串列表中每个元素是否存在。当然,我的出发点是来自 stackoverflow 的一些代码 https://stackoverflow.com/questions/9537797/r-grep-match-one-string-against-multiple-patterns:

#0.1 seconds
substrings <- sample(strings, 10)
system.time(matches <- lapply(substrings, grepl, strings, fixed=TRUE)) 

然而,这种方法对于较大的子字符串集来说有点幼稚,因为它存储所有匹配项和所有非匹配项:

#13 seconds
substrings <- sample(strings, 1000)
system.time(matches <- lapply(substrings, grepl, strings, fixed=TRUE)) 

我们可以通过仅存储匹配来减少输出对象的大小:

#13 seconds
substrings <- sample(strings, 1000)
system.time(matches <- lapply(substrings, function(x) which(grepl(x, strings, fixed=TRUE))))

但对于大量子字符串来说,这仍然很慢:

#316 seconds
substrings <- sample(strings, 25000)
system.time(matches <- lapply(substrings, function(x) which(grepl(x, strings, fixed=TRUE))))

时间呈线性增长很好,但我觉得必须有一种更快的方法来完成这项任务,也许可以避免lapply loop.

如何加速这个多对多字符串匹配功能?

/edit:一种简单的加速方法是并行化:

#Takes about 99 seconds
require('doParallel')
cl <- makeForkCluster(nnodes=8)
registerDoParallel(cl)
system.time(matches <- foreach(i=1:length(substrings)) %dopar% {
  which(grepl(substrings[i], strings, fixed=TRUE))
})
stopCluster(cl)

然而,我认为一旦找到快速串行算法,这个问题的大多数解决方案将很容易并行化。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R grepl:快速将多个字符串与多个子字符串匹配,返回所有匹配项 的相关文章

  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • 字符串池可以包含两个具有相同值的字符串吗? [复制]

    这个问题在这里已经有答案了 字符串池可以包含两个具有相同值的字符串吗 String str abc String str1 new String abc Will the second statement with new operator
  • Quantmod 的简单功能不再起作用

    我明天要交论文 我收到了一条关于 quantmod 的非常奇怪的错误消息 这是我在过去几周使用这个包时从未遇到过的 我无法导入特定于道琼斯指数 DJI 的数据 我收到以下错误消息 getSymbols DJI src yahoo from
  • purrr::可能函数可能无法与map2_chr函数一起使用

    我怀疑这是 purrr 包中的错误 但想先在 StackOverflow 中检查我的逻辑 在我看来 possibly功能在内部不起作用map2 chr功能 我正在使用 purrr 版本 0 2 5 考虑这个例子 library dplyr
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 访问或解析 R 中的 summary() 中的元素

    我运行以下 R 命令来进行 Dunnett 测试并获取摘要 如何访问下面线性假设的每一行 这是摘要输出的一部分 基本上我不知道摘要的结构 我尝试使用名称 但它似乎不起作用 因为我没有看到任何命名属性来提供这一点 library multco
  • 警告消息 - 来自 dummies 包的 dummy

    我正在使用 dummies 包为分类变量生成虚拟变量 其中一些变量具有两个以上类别 testdf lt data frame A as factor c 1 2 2 3 3 1 B c A B A B C C C c D D E D D E
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何按时间间隔匹配数据帧?

    这是我从数据记录器导入原始数据时经常出现的问题 温度记录仪设置为每十分钟记录一次温度 单独的气体记录仪设置为记录最后十分钟间隔内使用的气体 我想将这两个记录器的数据合并到一个数据框中进行绘图和分析 但时间并不完全一致 我希望每十分钟的时间段
  • 绘制 Cox 回归的 Kaplan-Meier 图

    我使用 R 中的以下代码设置了一个 Cox 比例风险模型来预测死亡率 添加协变量 A B 和 C 只是为了避免混淆 即年龄 性别 种族 但我们真正对预测变量 X 感兴趣 X 是一个连续变量 cox model lt coxph Surv t
  • 将列表中的每个元素转换为数据框中的一列

    假设我有以下列表 d library combinat d permn c a b c 这看起来如下 1 1 a b c 2 1 a c b 3 1 c a b 4 1 c b a 5 1 b c a 6 1 b a c 是否可以将此列表的
  • Javascript:删除字符串标点符号并拆分成单词?

    抱歉 如果之前有人问过这个问题 但我正在尝试从这样的字符串中获取单词数组 Exclamation Question Quotes Apostrophe Wasn t Couldn t Didn t 该数组应该看起来像这样 exclamati
  • 执行 Boyer-Moore 模式匹配时是否必须考虑编码?

    我即将实现 Boyer Moore 模式匹配算法的变体 具体来说是星期日算法 我问自己 我的字母表大小是多少 它是否取决于编码 可能的字符数 或者我可以假设我的字母表由 256 个符号组成 一个字节可以表示的符号数 在许多其他情况下 将字符
  • 在网格中制作一个矩形图例,并标记行和列

    我有一个 ggplot 我将因子映射到填充和 alpha 如下所示 set seed 47 the data lt data frame value rpois 6 lambda 20 cat1 rep c A B each 3 cat2
  • R在Windows平台Rstudio上打印data.frames中的UTF-8代码

    当数据框中存在UTF 8字符时 将无法正常显示 例如 以下内容是正确的 gt U6731 1 朱 但是当我将其放入数据框中并打印出来时 它是 gt data frame x U6731 x 1
  • data.table 抛出“找不到对象”错误[重复]

    这个问题在这里已经有答案了 我有一个数据表 library data table mydt lt data table index 1 10 当我在全局环境中尝试它时 我可以让它工作 但当我在调试器中或在包测试中使用它时却无法工作 问题是我
  • dplyr:连接中的 NSE (by)

    我很难弄清楚如何使用 dplyr left join 和 NSE 连接两个表 问题是我无法为 by 提供正确的值 我想我现在已经找到了解决方案 但感觉我正在以一种额外复杂的方式来做 因此 如果您知道更简单 更优雅的解决方案 请告诉我 这就是
  • R中IF函数的使用

    我正在短跑ifR 中的函数 但收到以下警告消息 In if runif 50 0 1 lt 0 69 the condition has length gt 1 and only the first element will be used
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 需要在R中跳过不同数量的行

    我正在使用以下代码来处理我的数据 但最近我意识到使用skip 27 在数据开始之前跳过存储在我的文件中的信息 不是一个好的选择 因为每个文件中要跳过的行数不同我的目标是读取存储在多个文件夹中的各种txt文件 并非所有文件都有相同的列数 列的

随机推荐

  • Lua math.random 不起作用

    所以我正在尝试创建一些东西 并且我到处寻找生成随机数的方法 然而 无论我在哪里测试代码 它都会产生非随机数 这是我写的一个例子 local lowdrops Wooden Sword Wooden Bow Ion Thruster Mach
  • 使用经过身份验证的 REST 请求缓存代理

    考虑以下场景 我有 RESTful URL articles 返回文章列表 用户在每个请求上使用授权 HTTP 标头提供其凭据 根据用户的权限 文章可能因用户而异 对于这种情况 是否可以使用缓存代理 例如 Squid 代理将只看到 URL
  • 如何在Golang中正确使用OAuth2获取谷歌电子邮件

    我已经尝试使用 OAuth 成功进行身份验证golang com x oauth2图书馆 provider variable is oauth2 Config scope is https www googleapis com auth u
  • xcodebuild:错误:“APP.xcworkspace”不存在

    我正在尝试使用 gitlab 设置 CI 当我尝试在本地构建时 出现此错误 xcodebuild error APP xcworkspace does not exist APP 不是真实名称 我也在使用 CocoaPods 我在终端中运行
  • 无法更新 RubyGems

    我在将 RubyGems 从版本 1 1 1 更新到最新版本时遇到困难 我尝试过以下方法 宝石更新 Result 更新已安装的 gem批量更新 Gem 源索引 http gems rubyforge org http gems rubyfo
  • 为结构变量赋值

    结构类型定义为 typedef struct student int id char name double score Student 我构造了一个 Student 类型的变量 并且想为其赋值 我怎样才能有效地做到这一点 int main
  • EVC++下的StandardSDK 4.0可以在远程设备上调试吗?

    我在跑 with 为运行 CE 5 0 的设备开发应用程序 我正在使用为此 它工作得很好 除了以下事实 虽然它以我的设备 即基于 SH4 的 PDA 为目标 但它不会让我选择 StandardSDK 模拟器以外的任何东西进行调试 如果我去工
  • Linux - TCP connect() 失败并出现 ETIMEDOUT

    对于 TCP 客户端 connect 调用 TCP 服务器 Richard Stevens 的 UNIX 网络编程 一书说道 如果客户端 TCP 未收到对其 SYN 段的响应 则返回 ETIMEDOUT 4 4BSD 例如 调用 conne
  • 为什么不能同时为结构体及其指针定义方法?

    鉴于设置第 54 张幻灯片 http tour golang org 54golang之旅 type Abser interface Abs float64 type Vertex struct X Y float64 func v Ver
  • 如何使用$.ajax(); Laravel 中的函数

    我需要通过 ajax 添加新对象 但我不知道如何在 laravel 中使用 ajax 函数 我在刀片模板中的形式是 Form open array url gt expense add method gt POST class gt for
  • 在 IntelliJ 中启用 Grails 3.x 自动重新加载

    可能并不重要 但是有人对 Grails 中的 IntelliJ 重新加载选项有疑问吗 从 IntelliJ Run App 集启动应用程序Reloading active false 我尝试通过控制台 powershwell 清理并重新启动
  • 如何使用 C# 文件 API 检查磁盘上的逻辑和物理文件大小

    如何使用 C api 读取逻辑和物理文件大小 new FileInfo path Length 是实际尺寸 至于磁盘上的大小 我认为没有 API 可以获取它 但您可以使用实际大小和簇大小来获取它 这里需要一些有关计算的信息 http soc
  • 编译时生成的表

    由于一些技巧 我能够在编译时生成一个表 但表中的值并不是很有用 例如 5x5 的表格如下所示 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 为了清楚起见 逗号的位置 创建该表的代码如下
  • MailApp.sendEmail 所有邮件被阻止[重复]

    这个问题在这里已经有答案了 最近我决定从基本的免费 G mail 帐户升级到 GSuite 帐户 我有一组 Google AppsScript 用于管理一组表单 电子表格并发送有关更改的通知 所有脚本都已复制到新的 GSuite 帐户中 并
  • jquery :[] 选择器?

    给定一个 SELECT 元素
  • 如何将日期转换为 GMT?

    如何将不同时区的日期转换为GMT 0 假设我有这样的约会 Fri Jan 20 2012 11 51 36 GMT 0500 Fri Jan 20 2012 11 51 36 GMT 0300 Fri Jan 20 2012 11 51 3
  • 如何提取 MVIMG 的照片/视频组件?

    Google Pixel 2 以及此后可能的其他手机都具有覆盖 动态照片 的功能 这些保存为MVIMG并且比较大 我正在寻找一种删除 提取视频的方法 到目前为止我发现了一个有前途的 exif 标签 exiftool xmp all MVIM
  • PHP 与 MySQL 8.0+ 错误:服务器请求客户端未知的身份验证方法[重复]

    这个问题在这里已经有答案了 我在 PHP 7 0 上运行 MySQL 版本 8 当我尝试从 PHP 连接到数据库时 出现以下错误 连接错误 SQLSTATE HY000 2054 服务器请求客户端未知的身份验证方法 PHP 可能会显示此错误
  • 理解字符串的真实性

    我知道Python内置类型有一个 真实性 值 空字符串被认为是False 同时考虑任何非空字符串True 这是有道理的 我可以使用内置函数检查这一点bool gt gt gt bool False gt gt gt bool dog Tru
  • R grepl:快速将多个字符串与多个子字符串匹配,返回所有匹配项

    我在 R 中有相当大的字符串集 set seed 42 strings lt sapply 1 250000 function x sample 2 20 1 prob c 0 001 0 006 0 021 0 043 0 075 0 1