将 purrr::map2() 与 dbplyr 一起使用

2024-01-25

我试图从一个表(“位置”)中选择行,其中特定列(“位置”)的值落在另一个表(“my_ranges”)中定义的范围内,然后从“我的范围”表。

我可以使用 tibbles 和几个来做到这一点purrr::map2调用,但相同的方法不适用于 dbplyr 数据库 tibbles。这是预期的行为吗?如果是,我是否应该采取不同的方法来使用 dbplyr 来完成此类任务?

这是我的例子:

library("tidyverse")
set.seed(42)

my_ranges <-
  tibble(
    group_id = c("a", "b", "c", "d"),
    start = c(1, 7, 2, 25),
    end = c(5, 23, 7, 29)
    )

positions <-
  tibble(
    position = as.integer(runif(n = 100, min = 0, max = 30)),
    annotation = stringi::stri_rand_strings(n = 100, length = 10)
  )

# note: this works as I expect and returns a tibble with 106 obs of 3 variables:
result <- map2(.x = my_ranges$start, .y = my_ranges$end,
             .f = function(x, y) {between(positions$position, x, y)}) %>%
  map2(.y = my_ranges$group_id,
              .f = function(x, y){
                positions %>%
                  filter(x) %>%
                  mutate(group_id = y)}
) %>% bind_rows()

# next, make an in-memory db for testing:
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")

# copy data to db
copy_to(con, my_ranges, "my_ranges", temporary = FALSE)
copy_to(con, positions, "positions", temporary = FALSE)

# get db-backed tibbles:
my_ranges_db <- tbl(con, "my_ranges")
positions_db <- tbl(con, "positions")

# note: this does not work as I expect, and instead returns a tibble with 0 obsevations of 0 variables:
# database range-based query:
db_result <- map2(.x = my_ranges_db$start, .y = my_ranges_db$end,
                  .f = function(x, y) {
                    between(positions_db$position, x, y)
                    }) %>%
  map2(.y = my_ranges_db$group_id,
       .f = function(x, y){
         positions_db %>%
           filter(x) %>%
           mutate(group_id = y)}
  ) %>% bind_rows()

只要每次迭代创建一个相同维度的表,那么就可能有一种巧妙的方法将整个操作推送到数据库。这个想法是同时使用map() and reduce() from purrr. Each tbl_sql()操作是惰性的,因此我们可以迭代它们,而不必担心发送一堆查询,然后我们可以使用union()基本上将每次迭代生成的 SQL 附加到下一次迭代中,使用UNION来自给定数据库的子句。这是一个例子:

library(dbplyr, warn.conflicts = FALSE)
library(dplyr, warn.conflicts = FALSE)
library(purrr, warn.conflicts = FALSE)
library(DBI, warn.conflicts = FALSE)
library(rlang, warn.conflicts = FALSE)

con <- DBI::dbConnect(RSQLite::SQLite(), path = ":dbname:")

db_mtcars <- copy_to(con, mtcars)

cyls <- c(4, 6, 8)

all <- cyls %>%
  map(~{
    db_mtcars %>%
      filter(cyl == .x) %>%
      summarise(mpg = mean(mpg, na.rm = TRUE)
      )
  }) %>%
  reduce(function(x, y) union(x, y)) 

all
#> # Source:   lazy query [?? x 1]
#> # Database: sqlite 3.22.0 []
#>     mpg
#>   <dbl>
#> 1  15.1
#> 2  19.7
#> 3  26.7

show_query(all)
#> <SQL>
#> SELECT AVG(`mpg`) AS `mpg`
#> FROM (SELECT *
#> FROM (SELECT *
#> FROM `mtcars`)
#> WHERE (`cyl` = 4.0))
#> UNION
#> SELECT AVG(`mpg`) AS `mpg`
#> FROM (SELECT *
#> FROM (SELECT *
#> FROM `mtcars`)
#> WHERE (`cyl` = 6.0))
#> UNION
#> SELECT AVG(`mpg`) AS `mpg`
#> FROM (SELECT *
#> FROM (SELECT *
#> FROM `mtcars`)
#> WHERE (`cyl` = 8.0))

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

将 purrr::map2() 与 dbplyr 一起使用 的相关文章

  • R:使用管道将单个参数传递到函数中的多个位置

    我试图专门使用管道来重写以下代码 使用babynames包中的babynames数据 library babynames library dplyr myDF lt babynames gt group by year gt summari
  • 如何在R中逐行写入文件

    我正在尝试逐行读取 csv 文件 并且仅选择左侧的第二个和第三个单元格以及右侧的第三个单元格 例如 如果这一行中有 17 个单元格 我将选取第 15 个单元格 然后我想合并这 3 个单元格 用逗号分隔 然后将此行写入一个新的 csv 文件
  • 我可以调整scale_color_brewer的下限吗?

    我已经订购了我想使用 color Brewer 的分类数据 但我很难看到非常低的值 有没有办法去掉这些较低的值或设置范围的下限 ggplot data frame x 1 6 y 10 15 w letters 1 6 aes x y co
  • 如何在multilist中设置xlim?

    以下代码创建 3 个向量 并将它们显示为交错直方图 a lt c 1 2 3 b lt c 1 1 2 c lt c 1 1 1 l lt list a b c multhist l col c red green blue xlim c
  • 如何使用r中的dplyr在特定位置插入空白行

    我想在数据框中的特定位置插入空白行 我的数据框是这样的 dat lt data frame group c rep A 1 rep B 4 rep C 2 rep D 2 group 1 A 2 B 3 B 4 B 5 B 6 C 7 C
  • 如何优化 R 中的 sapply 来计算数据帧上的运行总计

    我在 R 中编写了一个函数来按月份计算累积总数 但随着数据集变大 我的方法的执行时间呈指数增长 我是一名 R 程序员新手 你能帮我提高效率吗 该函数以及我调用该函数的方式 accumulate lt function recordnum d
  • for 循环与 cor.test 在许多类别上

    我正在尝试在 R 中编写一个循环 它将循环遍历 3 个不同的物种 以计算两个连续变量 Redness 和 VarNormAbund 之间的相关性 我的循环正在运行 但 3 个物种中每一个的输出都是相同的 这让我认为循环卡在第一个物种上 co
  • 如何制作一连串的ggplots并在它们之间绘制箭头?

    对于一个项目 我需要绘制一些图并在它们之间放置箭头作为序列的指示 我想知道我是否可以用 ggplot 来做到这一点 是否可以使用 ggplot2 绘制一个干净的大箭头并将其添加到最终的多重图中 作为示例 我使用此代码来绘制绘图 librar
  • 如何根据查找表匹配多列

    我有以下两个数据框 lookup lt data frame id c A B C price c 1 2 3 results lt data frame price 1 c 2 2 1 price 2 c 3 1 1 我现在想要浏览所有列
  • 在 R 中收集多组列[重复]

    这个问题在这里已经有答案了 我有一个宽数据框 需要将其收集或融化成一个高数据框 我遇到的问题是我有几组列需要保持关联 分组 我每个表单提交有 2 个用户 每个用户有 3 列数据 我想将这 6 列基本上以 3 组的形式堆叠起来 以便每个用户都
  • 使用插入符和方法 = gamLoess 进行训练时 R 崩溃

    当我运行下面的代码时 R 崩溃了 如果我在训练调用中注释掉tuneGrid行 就不会发生崩溃 我已经用另一个数据集尝试过此操作 但仍然使 R 崩溃 崩溃消息是 R 会话中止 R遇到致命错误 会话被终止 开始新会话 代码是 library s
  • 单击 R Shiny 中的按钮后将输入字段重置为 null

    我正在构建一个应用程序 用户可以在其中按列输入表的数据值 单击 添加 按钮后 输入的值将按列附加到现有值 例如 如果输入 col1 2 3 并单击 ADD 我们将在显示屏中看到 col1 2 3 如果输入 col2 4 7 并单击 ADD
  • 用plotly创建丝带

    我需要在散点图上绘制加速度与英里 加仑的两个斜率 轻型汽车一处斜坡 重型汽车一处斜坡 我创建了这个 cars light lt cars log cars log log weight lt log mean cars weight car
  • R:行数不相等的列绑定

    我有两个数据集 它们每个都有变量 ID Block 和 RT 反应时间 我想合并 列绑定这两个集合 以便我拥有一个包含变量的数据集 ID 块 RT1 RT2 问题是两个集合中的行数不相等 此外 ID 和块号匹配也很重要 缺失值应替换为 NA
  • R 的 read.csv 在第一列名称前面加上垃圾文本[重复]

    这个问题在这里已经有答案了 我已将数据从 SQL Server Management Studio 中的结果网格导出到 csv 文件 csv 文件看起来正确 但是当我使用 read csv 将数据读入 R 数据帧时 第一个列名称前面带有 如
  • 在闪亮应用程序的 DT::datatable 中添加、删除和编辑行

    我有下面闪亮的应用程序 我可以通过按添加新行Add基于闪亮的小部件选择 我可以通过按选择并删除一行Delete我想将它们与单击一行的功能结合起来 然后在按Edit 例如 如果我单击第二行 然后更改Security Type小部件来自Stoc
  • 如何在 R 中为所有plot.default、plot 或lines 调用设置默认颜色

    为了简化我的日常 R 交互 我想为所有绘图设置默认颜色 例如 假设我想要用红线绘制所有绘图 例如在 gnuplot 中 到目前为止 这是我的 Rprofile 的片段 setHook packageEvent grDevices onLoa
  • 在 R 中,为什么 sum 与其他方法(例如 cumsum)相比如此慢?

    我正在尝试实现一个需要非常快的函数 主要是因为它一遍又一遍地处理巨大的数据帧 R 总是让我感到困惑 为什么它有时有点慢 而有时又慢得离谱 不幸的是 它从来都不快 不管怎样 我一直认为 如果可能的话 当以某种方式推入 apply sapply
  • 如何在 R 中解析堆叠多个 JSON 的文件?

    我在 R 中有以下 堆叠 JSON 对象 example1 json ID 12345 Timestamp 20140101 Usefulness Yes Code event1 A result 1 ID 1A35B Timestamp
  • R:中断 for 循环

    你能确认下一个break是否取消了内部for循环吗 for out in 1 n old id velho lt old table df id out for in in 1 n id novo lt new table df ID in

随机推荐

  • 替换文本文件中的一行

    我有一个文本文件 被另一个应用程序用作配置文件 我已将文件的每一行读入字符串数组 string arrLine File ReadAllLines pathToFile 这正是我需要的 现在 我需要做的就是用字符串替换 arrLine x
  • 如何从角度材料日期选择器获取当前时间?

    我正在使用角度材料日期选择器https material angular io components select overview https material angular io components select overview
  • 在CMake项目下编译单个文件?

    我正在开发一个 C 项目 该项目将包含在一个更大的项目中 我已经看到 在更大的项目 是一个 Qt 应用程序 它是从 qmake 生成的 上 我可以从 linux 命令行编译单个文件 只需输入特定文件的相对路径作为 make 的参数 另一方面
  • 尝试将实体编码为 json 时出现问题

    我尝试将 Doctrine 实体编码为 JSON 字符串 以作为 Ajax 响应发送 所以 我检查了文档 串行器组件 http symfony com doc current components serializer html 我尝试使用
  • Vue.js 空过滤结果

    在 Vue 中 我必须过滤一些数据
  • Swift3随机扩展方法

    我使用这个扩展方法来生成随机数 func Rand range Range
  • 从使用 atexit() 注册的函数内部获取退出状态

    在我的里面atexit 注册函数我想获得退出状态 参数exit 3 或者 main 返回了什么 有没有任何便携式方法可以做到这一点 是否有任何 GNU libc 特定的方法可以做到这一点 例如我可以引用的全局持有该值 这是一个技巧 hack
  • 如何将图片上传到另一台服务器?

    我想创建一个提供 html 内容的应用程序服务器 其中包含由不同域上的另一台服务器提供的静态图像的链接 图片由用户通过应用服务器上传 我将执行以下操作将 JPEG 文件上传到应用程序服务器 if file exists folder nam
  • TFS 构建失败,但 Visual Studio 可以工作

    我做了一个新的构建定义 大多数选项保留默认值 我暂时只是玩玩而已 问题是 当我在 Visual Studio 2013 中以发布模式构建项目时 一切都很好 没有错误 当 TFS 构建它时 我遇到了一些错误 我必须将其从我自己的语言翻译成英语
  • 如何在滚动视图中调整图像视图的大小,就像在此图像中完成的那样?

    我创建了一个滚动视图 并在其中放置了一个图像视图 我希望滚动它以与下图中相同的方式调整大小 但到目前为止我还没有取得什么成功 在我的尝试中 图像在滚动时调整了大小 但是调整大小后仍有剩余空间 您将如何修改以下内容 Image 到目前为止我的
  • JS 中的 Excel PMT 函数

    我在互联网上找到了一个关于 PMT 计算的小片段 function PMT i n p return i p Math pow 1 i n 1 Math pow 1 i n function CalculatePMTFromForm idL
  • 如何在多个显示器上最大化窗口?

    使用 AutoHotkey 如何绑定热键以在多个显示器上拉伸 最大化 跨越窗口 以便它覆盖两个显示器 现在 我必须通过用鼠标手动拉伸窗口来完成此操作 我知道有专用工具可以执行此操作 但我已经在运行 AutoHotkey 脚本 并且宁愿限制我
  • SOQL python 中的通配符

    我正在尝试使用 simple salesforce 包使用 python 从 salesforce 进行查询 当我使用通配符时 它会抛出故障错误 soql SELECT FROM Contact where LastModifiedDate
  • Protractor 的 waitForAngular() 在 angular-webapp 上失败(真实设备上的 appium/chrome)

    我 新 使用量角器来运行 e2e 黄瓜测试 我有一个基于 angularJS 的网络应用程序 我正在使用 appium 在真实的 Android 设备上远程运行测试 这是我正在使用的版本 windows8 1 email protected
  • SBT:评估任务顺序

    我正在尝试获取有关 sbt 项目中所有模块的信息 有以下代码 lazy val getModule taskKey Module get single module info lazy val allModules taskKey Seq
  • 在 FilterChain.doFilter() - HttpServletResponseWrapper 之后添加 Cookie 以忽略刷新?

    我想将 cookie 添加到HttpServletResponse其内容 通常是 HTML 呈现后 正如这里提到的 http osdir com ml java jasig uportal 2005 10 msg00276 html htt
  • 基于 SQS 消息触发 SWF 工作流

    前言 我正在尝试针对我认为非常常见的用例提出一个提案 并且我想使用 Amazon 的 SWF 和 SQS 来实现我的目标 可能还有其他服务更符合我想要做的事情 所以如果您有建议 请随时扔掉它们 Problem 最基本的需求是客户端 移动设备
  • 在 webpack 中使用 file-loader 和 html-loader 时,图像的 src attr 为“[object Module]”

    我正在从头开始使用 webpack4 做一个项目 但是当我尝试在 HTML 文件中显示图像时 我遇到了一个奇怪的问题 后npm run build 图像标签的src构建为
  • Scala 中需要 @tailrec 注解吗? [复制]

    这个问题在这里已经有答案了 我了解递归函数的问题以及堆栈溢出问题的风险 但是 如果一个函数能够针对尾递归进行优化 那么为什么不自动应用此优化 即 为什么我需要标记一个可以优化的函数 tailrec 如果一个函数能够针对尾递归进行优化 那么为
  • 将 purrr::map2() 与 dbplyr 一起使用

    我试图从一个表 位置 中选择行 其中特定列 位置 的值落在另一个表 my ranges 中定义的范围内 然后从 我的范围 表 我可以使用 tibbles 和几个来做到这一点purrr map2调用 但相同的方法不适用于 dbplyr 数据库