Data.table:如何获取它所承诺的极快的子集并将其应用于第二个 data.table

2023-12-06

我试图根据另一个数据集(lsr)的子集来丰富一个数据集(依从性)。对于依从性中的每一行,我想计算(作为第三列)可用于实施规定方案的药物。我有一个返回相关结果的函数,但它仅在我必须运行它的总数据的一个子集上运行数天。

数据集是:

 library(dplyr)
library(tidyr)
library(lubridate)
library(data.table)

adherence <- cbind.data.frame(c("1", "2", "3", "1", "2", "3"), c("2013-01-01", "2013-01-01", "2013-01-01", "2013-02-01", "2013-02-01", "2013-02-01"))
names(adherence)[1] <- "ID" 
names(adherence)[2] <- "year"
adherence$year <- ymd(adherence$year)

lsr <- cbind.data.frame(
  c("1", "1", "1", "2", "2", "2", "3", "3"), #ID
  c("2012-03-01", "2012-08-02", "2013-01-06","2012-08-25", "2013-03-22", "2013-09-15", "2011-01-01", "2013-01-05"), #eksd
  c("60", "90", "90", "60", "120", "60", "30", "90") # DDD
)
names(lsr)[1] <- "ID"
names(lsr)[2] <- "eksd"
names(lsr)[3] <- "DDD"

lsr$eksd <- as.Date((lsr$eksd))
lsr$DDD <- as.numeric(as.character(lsr$DDD))
lsr$ENDDATE <- lsr$eksd + lsr$DDD
lsr <- as.data.table(lsr)

adherence <- as.data.table(adherence)

我习惯使用 dplyr,但它慢得多,我重写了 data.table 的内容来尝试一下。令我抓狂的是,我与 SAS 合作的同事声称这对他们来说不会花费很长时间,而我只是将数据本身加载到 RAM 中就需要几个小时。 (fread 在我的几个数据集上导致 R 崩溃)。 依从性为 1.5 mio 行,LSR 为几百 mio。行。

我的工作功能是

function.AH <- function(x) {
  lsr[ID == x[1] & eksd <= x[2] & ENDDATE > x[2], ifelse(.N == 0, 0, sum(as.numeric(ENDDATE - as.Date(x[2]))))]
}
setkey(lsr, ID, eksd, ENDDATE)
adherence$AH <-apply (adherence, 1,  FUN = function.AH) #DESIRED OUTPUT

我不知道最好的方法:我已经研究过使用 SQL 数据库,但据我了解,当我的数据适合 RAM(我有 256GB)时,这不应该更快。由于依从性 data.table 实际上是重复 500 个时间段的每个单独 ID(即 ID 1:在时间 1、时间 2、时间 3...时间 500,ID 2:在时间 1、时间 2...等)我还考虑过在 lsr 上的 ID 上使用 by 函数,以及如何将此时间间隔 (1:500) 嵌入到 j 中的函数中。

我希望有人能够指出我如何低效地使用 apply 函数,而不是以某种方式将其应用到 data.table-framework 中,从而失去了构建效率。但由于我将处理这些数据和类似大小的数据,因此我很感激任何用于更快解决此问题的具体建议或使用其他方法获得更快运行时间的一般建议。


这可以通过以下方式解决在非等值连接中更新.

这避免了由笛卡尔连接或调用引起的内存问题apply()它将 data.frame 或 data.table 强制转换为涉及复制数据的矩阵。

此外,OP 还提到lsr has a 几百米奥。行 and adherence有 1.5 mio 行(500 个时间段乘以 3000ID的)。因此,数据项的有效存储不仅会减少内存占用,而且还可以减少加载数据所需的处理时间份额。

library(data.table)
# coerce to data.table by reference, i.e., without copying
setDT(adherence)
setDT(lsr)
# coerce to IDate to save memory
adherence[, year := as.IDate(year)]
cols <- c("eksd", "ENDDATE")
lsr[, (cols) := lapply(.SD, as.IDate), .SDcols = cols]
# update in a non-equi join
adherence[lsr, on = .(ID, year >= eksd, year < ENDDATE), 
                      AH := as.integer(ENDDATE - x.year)][]
   ID       year AH
1:  1 2013-01-01 NA
2:  2 2013-01-01 NA
3:  3 2013-01-01 NA
4:  1 2013-02-01 64
5:  2 2013-02-01 NA
6:  3 2013-02-01 63

注意NA表明没有找到匹配项。如果需要的话,AH列可以在非等值连接之前初始化adherence[, AH := 0L].

Data

可以简化创建示例数据集的代码:

adherence <- data.frame(
  ID = c("1", "2", "3", "1", "2", "3"), 
  year = as.Date(c("2013-01-01", "2013-01-01", "2013-01-01", "2013-02-01", "2013-02-01", "2013-02-01")),
  stringsAsFactors = FALSE)

lsr <- data.frame(
  ID = c("1", "1", "1", "2", "2", "2", "3", "3"),
  eksd = as.Date(c("2012-03-01", "2012-08-02", "2013-01-06","2012-08-25", "2013-03-22", "2013-09-15", "2011-01-01", "2013-01-05")),
  DDD = as.integer(c("60", "90", "90", "60", "120", "60", "30", "90")),
  stringsAsFactors = FALSE)
lsr$ENDDATE <- lsr$eksd + lsr$DDD

注意DDD是整数类型,通常需要 4 个字节,而不是 numeric/double 类型的 8 个字节。

另请注意最后一条语句may导致整个数据对象lsr被复制。可以通过使用通过引用更新的 data.table 语法来避免这种情况。

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

Data.table:如何获取它所承诺的极快的子集并将其应用于第二个 data.table 的相关文章

  • 将日期时间字符串转换为 Date 类

    我有一个带有日期时间字符列的数据框 当我使用as Date 除了少数实例之外 我的大多数字符串都被正确解析 下面的示例有望向您展示发生了什么 my attempt to parse the string to Date uses the s
  • 从 data.frame 中提取时用 NA 填充缺失的列

    我有一个函数 它将具有某些列的数据框作为输入 columns a b z 现在我有一个数据框DF只有很少的这些列DF columns f u z 如果列不在其中 如何创建一个包含所有值为 NA 的列的数据框DF这与DF在柱子上 f u z
  • 如何有效地将多个光栅 (.tif) 文件导入 R

    我是 R 新手 尤其是在空间数据方面 我正在尝试找到一种方法来有效地将多个 600 单波段栅格 tif 文件导入到 R 中 所有文件都存储在同一文件夹中 不确定这是否重要 但请注意 在我的 Mac 和 Windows 并行 VM 上的文件夹
  • 改进R中从google获取股票新闻数据的功能

    我已经编写了一个函数来从 Google 获取和解析给定股票代码的新闻数据 但我确信有一些方法可以改进它 对于初学者来说 我的函数返回一个 GMT 时区的对象 而不是用户当前的时区 如果传递的数字大于 299 它就会失败 可能是因为 goog
  • R data.table 多个条件连接

    我设计了一种解决方案 用于从两个单独数据表的多个列中查找值 并添加基于新列的值计算 多个条件比较 代码如下 它涉及在计算两个表中的值时使用 data table 和联接 但是 这些表没有联接在我正在比较的列上 因此我怀疑我可能无法获得 da
  • RStudio 不会通过 rPython 调用加载所有 Python 模块

    我从 Bash 和 RStudio 中运行相同的脚本时出现一些意外行为 请考虑以下事项 我有一个文件夹 rpython 包含两个脚本 test1 R library rPython setwd rpython python load tes
  • 通过 r markdown 中的循环创建代码片段

    如同如何使用R中的knitr创建一个包含代码块和文本的循环 https stackoverflow com questions 36373630 how to create a loop that includes both a code
  • R data.table 1.9.2 关于 setkey 的问题

    这似乎是 1 8 10 后引入的一个错误 与包含列表的 DT 的 setkey 相关 运行下面两个代码来查看问题 library data table dtl lt list dtl 1 lt data table scenario 1 p
  • rvest 和 NHL 统计数据的 CSS 选择器问题

    我想从 hockey reference com 中抓取数据 特别是从以下链接中抓取数据 https www hockey reference com leagues NHL 1991 html https www hockey refer
  • R 中的龙卷风图

    我正在尝试在 R 中绘制龙卷风图 又名敏感性图 目标是可视化某些变量增加 10 和减少 10 的效果 到目前为止我已经得到这个结果 这是我正在使用的代码 Tornado plot data lt matrix c 0 02 0 02 0 0
  • 如何在 R 中绘制一列与其余列的关系图

    我有一个数据集 其中 1 是时间 接下来的 14 个是幅度 我想在一张图表上散布所有大小与时间的关系 其中每个不同的列都是网格化的 分层在另一个之上 我想使用原始数据来制作这些图表 并单独制作它们 但只想执行此过程一次 数据集A 唯一的自变
  • C# 数据表来保存表格(无限嵌套)

    我相对较新C 但来自C C 背景 我需要一个类似于的数据类型 类 DataTable 但允许存储的列保存 简单 类型 int float boolean string 以及相同类型的数据 以便一个列可以保存另一个表 该表也具有存储表等的列
  • 读取R中打开的Excel文件

    有没有办法将打开的Excel文件读入R 当Excel中打开一个excel文件时 Excel会对文件加锁 比如R中的read方法无法访问该文件 你能绕过这个锁吗 Thanks 编辑 这发生在带有原始 Excel 的 Windows 下 发生错
  • 手动设置scale_fill_distiller()的比例

    我正在尝试制作一系列图表进行比较 举例来说 我想使用iris数据集来制作这样的图 其中我已过滤以仅查看 setosa 物种 library ggplot2 library dplyr iris gt filter Species setos
  • 排序因素与水平

    有人能解释一下 R 中 ordered 参数的用途吗 R says ordered逻辑标志来确定级别是否应被视为有序 按给定的顺序 所以如果我有一个名为名称的因素并设置ordered TRUE names lt factor c fred
  • 如何自动启动我的 ec2 实例、运行命令然后将其关闭?

    我想每周对 redshift postgres 数据库中的数据运行一次机器学习模型 我使用以下命令将 R 脚本设置为休息 apiplumbr然后我将其设置为一项任务来管理pm2 我有它 所以任务会在ec2实例启动然后继续运行 要让 R 脚本
  • 合并数据框而不重复行

    我想合并两个数据框 但如果有多个匹配项 则不想重复行 相反 我想总结一下那天的观察结果 来自 合并 提取两个数据框中与指定列匹配的行并将其连接在一起 如果有多个匹配项 则所有可能的匹配项各贡献一行 这是一些示例代码 days lt as d
  • 当有很多列时,使用 readr::read_csv() 导入数据时覆盖列类型

    我正在尝试使用 R 中的 readr read csv 读取 csv 文件 我导入的 csv 文件大约有 150 列 我只包含示例的前几列 我希望将第二列从默认类型 我执行 read csv 时为日期 覆盖为字符或其他日期格式 GIS Jo
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • 通过使用 navbarPanel() 并隐藏导航栏构建多页闪亮应用程序用户端(在 ui.R 中)?

    我想构建一个多页闪亮应用程序 我可以在其中控制用户可以看到哪个页面 迪安 阿塔利确实这个演示应用程序中有类似的东西 https github com daattali advanced shiny tree master multiple

随机推荐

  • Javascript 密码正则表达式

    我正在编写用于在 Javascript 中验证密码的正则表达式 限制条件是 密码必须包含至少一个大写字符 密码必须至少包含一个特殊字符 经过反复试验和在网上进行一些搜索 我发现这是可行的 A Z 有人可以解释一下这个表达式中提到大写字母和特
  • 从 Google App Engine 应用程序运行 Google Dataflow 管道?

    我正在使用 DataflowPipelineRunner 创建数据流作业 我尝试了以下场景 不指定任何机器类型 配g1小机 与 n1 highmem 2 在上述所有场景中 输入是来自 GCS 的文件 该文件非常小 KB 大小 输出是 Big
  • 将顶点行折叠为嵌套表类型(按 ID 聚合)

    测试数据 with cte as select 1 as id 100 as x 101 as y from dual union all select 1 as id 200 as x 201 as y from dual union a
  • 如何将 Java ZonedDateTime 转换为具有默认时区偏移量的 OffsetDateTime?

    假设我的 ZonedDateTime 为2018 10 30T18 04 58 874Z 我怎样才能将其转换为 OffsetDateTime2018 10 30T13 04 58 874 05 00 我希望偏移量是默认 系统偏移量 例如从O
  • 将 P/Invokes 移至 NativeMethods 类,因为它是 P/Invoke 方法消息

    有人可以建议我与此消息有什么关系吗 CA1060 将 P Invoke 移至 NativeMethods 类 因为它是 P Invoke 方法 UControl InternetGetConnectedState out int int 应
  • 从右值引用限定方法返回右值引用是一个好习惯吗?

    据我所知 一般规则是根本不从函数返回右值引用 极少数特殊情况除外 但是类方法呢 C 标准库中有一个从类的右值引用限定方法返回右值引用的示例 std optional
  • PowerShell:脚本失败,因为 AD 对象没有足够快地复制

    我有一个脚本 可以创建两个组 一堆文件夹 并设置这些文件夹的权限 在我的测试环境中 所有这些过程都可以正常工作 但在我的生产环境中我遇到了问题 设置文件夹的权限失败 因为我创建的组尚未通过所有 8 个域控制器进行复制 是否可以让 Power
  • “Value”实际上是 Range 对象的默认属性吗?

    在开始之前我想说 我意识到你永远不应该依赖默认属性 我也不会 但这很奇怪 我一直读到过value是默认属性Range对象 这就是为什么它有效 Range A1 2 然而 this页面声称item是默认属性Range 此外 我制作的这个子集建
  • 使用G++编译多个.cpp和.h文件

    我刚刚继承了一些 C 代码 这些代码用一个包含 main 函数和一堆其他函数的 cpp 文件编写得很糟糕 还有 h包含类及其函数定义的文件 到目前为止 程序是使用命令编译的g main cpp 现在我已经把班级分开了 h and cpp文件
  • GitHub 从拉取请求克隆?

    我想从 GitHub 克隆一个存储库 问题是我不想要主分支 我想要的版本是这个未经批准的拉取请求 我是否可以克隆拉取请求版本而不是主存储库 最简单的方法是这样的 git fetch origin pull
  • 来自锁屏 iPhone 时重绘 GUI ondidreceivelocalnotification

    收到 UILocalNotification 后 如何防止 GUI 从锁定屏幕返回时重绘 在 didReceiveLocalNotification 中 我呈现了一个模态视图 但在此之前会显示视图控制器的旧状态 我该如何防止这种情况 当我从
  • 如何编写一个程序来使用 3.0 之前的 Android 连接到 a2dp 蓝牙设备?

    我的应用程序需要通过蓝牙连接到 a2dp 设备 并且我希望 能够查询可见的蓝牙设备 然后选择一个 a2dp 设备并让它 通过 a2dp 连接 以便音频开始通过连接的设备播放 但我的手机运行的是姜饼 2 3 3 我完成了基本的蓝牙教程 htt
  • JPA Criteria Builder 按总和列排序

    我有以下 SQL 查询 select colA sum colB as colB from tableA group by colA order by colB desc 我已经使用 jpa criteria builder 动态构建查询
  • C++ strtok - 多次使用更多数据缓冲区

    我使用时没有什么问题strtok 功能 我正在解析两个文件 首先我将文件 1 加载到buffer 该文件包含我需要加载的第二个文件的名称 这两个文件都是逐行读取的 我的代码如下所示 char second file name 128 cha
  • 使用 jQuery 制作 CSS3 渐变位置动画

    是否可以使用 jQuery 对 CSS3 渐变颜色的位置进行动画处理 我想以此为动画 background moz linear gradient top FF0000 0 FF0000 0 FFFFFF 0 FFFFFF 100 fire
  • 使组合框可编辑

    我想让组合框在 C 中可编辑 它应该接受来自键盘和下拉列表的输入 并且我想将输入的文本附加到下拉列表中 你需要 1 将 AutoCompleteMode 属性设置为 AutoCompleteMode SuggestAppend 2 将 Au
  • 参考.Net Core 2.0项目中的.Net Framework 4.5.2

    我花了几个小时试图弄清楚为什么 Net Core 2 0 不会加载 Net Framework 4 5 2 nuget 包 现在我想是时候问一下了 发生的情况是我有一个 Net Core 2 0 WebApi 应用程序 A 并且我想重用我的
  • 通过反射使用默认参数实例化案例类

    我需要能够通过反射实例化各种案例类 既可以确定构造函数的参数类型 也可以使用所有默认参数调用构造函数 我已经做到了这一点 import reflect runtime universe gt ru val m ru runtimeMirro
  • ASP.Net Core的ConfigureServices中访问数据库(EF Core DbContext)

    我想向 ASP Net Core 授权添加一些策略 这些策略存储在我的数据库 EF Core with MySQL 中 目标是根据用户的权限限制用户的访问 据我所知 我应该在ConfigureServices方法中的Startup像这样的类
  • Data.table:如何获取它所承诺的极快的子集并将其应用于第二个 data.table

    我试图根据另一个数据集 lsr 的子集来丰富一个数据集 依从性 对于依从性中的每一行 我想计算 作为第三列 可用于实施规定方案的药物 我有一个返回相关结果的函数 但它仅在我必须运行它的总数据的一个子集上运行数天 数据集是 library d