R data.table 使用 lapply 创建自定义函数来创建和重新分配多个变量

2024-03-04

我有以下几行代码:

DT[flag==T, temp:=haz_1.5]
DT[, temp:= na.locf(temp, na.rm = FALSE), "pid"]
DT[agedays==61, haz_1.5_1:=temp]

我需要将其转换为一个函数,以便它可以处理一系列变量,而不仅仅是一个变量。我最近学习了如何使用 lapply 通过传递列列表和创建一组新列的条件来创建函数。但是,当我传递列列表以及在这些列上向前传递变量的所有值时,我不确定如何执行此操作。

例如,我可以编写以下代码:

  columns<-c("haz_1.5", "waz_1.5")
  new_cols <- paste(columns, "1", sep = "_")
  x=61
  maled_anthro[(flag==TRUE)&(agedays==x), (new_cols) := lapply(.SD, function(y) na.locf(y,    na.rm=F)), .SDcols = columns] 

但我缺少 na.locf 步骤,因此在构建函数之前没有获得与原始代码行相同的输出。我如何将利用 na.locf 传递值 (DT[ temp:= na.locf(temp, na.rm = FALSE), "pid"]) 的代码行合并到此函数中,其中所有数据都包装到单个函数中?这会以同样的方式与 lapply 一起工作吗?

与我正在使用的数据表类似的虚拟数据:

DT <- data.table(pid  = c(1,1,2,3,3,4,4,5,5,5),
                 flag = c(T,T,F,T,T,F,T,T,T,T),
                 agedays = c(1,61,61,51,61,23,61,1,32,61),
                 haz_1.5 = c(1,1,1,2,NA,1,3,2,3,4),
                 waz_1.5 = c(1,NA,NA,NA,NA,2,2,3,4,4))

OP的代码可以变成一个匿名函数,应用于所选的columns:

library(data.table)
columns <- c("haz_1.5", "waz_1.5")
new_cols <- paste0(columns, "_1")
x <-  61

DT[, (new_cols) := lapply(.SD, function(v) {
  temp <- fifelse(flag, v, NA_real_)
  temp <- nafill(temp, "locf")
  fifelse(agedays == x, temp, NA_real_)
}), .SDcols = columns, by = pid][]
    pid  flag agedays haz_1.5 waz_1.5 haz_1.5_1 waz_1.5_1
 1:   1  TRUE       1       1       1        NA        NA
 2:   1  TRUE      61       1      NA         1         1
 3:   2 FALSE      61       1      NA        NA        NA
 4:   3  TRUE      51       2      NA        NA        NA
 5:   3  TRUE      61      NA      NA         2        NA
 6:   4 FALSE      23       1       2        NA        NA
 7:   4  TRUE      61       3       2         3         2
 8:   5  TRUE       1       2       3        NA        NA
 9:   5  TRUE      32       3       4        NA        NA
10:   5  TRUE      61       4       4         4         4

这与我们手动重复两列的 OP 代码时得到的结果相同(请注意,需要清除temp之前的列通过引用分配其中的一部分。)

DT[(flag), temp := haz_1.5]
DT[, temp := zoo::na.locf(temp, na.rm = FALSE), by = pid]
DT[agedays == 61, haz_1.5_1 := temp]
DT[, temp := NULL]
DT[(flag), temp := waz_1.5]
DT[, temp := zoo::na.locf(temp, na.rm = FALSE), by = pid]
DT[agedays == 61, waz_1.5_1 := temp]
DT[, temp := NULL][]
    pid  flag agedays haz_1.5 waz_1.5 haz_1.5_1 waz_1.5_1
 1:   1  TRUE       1       1       1        NA        NA
 2:   1  TRUE      61       1      NA         1         1
 3:   2 FALSE      61       1      NA        NA        NA
 4:   3  TRUE      51       2      NA        NA        NA
 5:   3  TRUE      61      NA      NA         2        NA
 6:   4 FALSE      23       1       2        NA        NA
 7:   4  TRUE      61       3       2         3         2
 8:   5  TRUE       1       2       3        NA        NA
 9:   5  TRUE      32       3       4        NA        NA
10:   5  TRUE      61       4       4         4         4

一些解释

  • OP 的“单列”代码和这种方法之间有一个重要的区别:为分组变量中的每一项调用匿名函数pid。在OP的代码中,第一个和最后一个分配正在处理未分组(完整)向量(也许这可能更有效)。然而,这些分配的结果独立于pid结果是一样的。
  • 代替zoo::na.locf(), 数据表的nafill()使用函数(data.table v1.12.4 的新功能,CRAN 2019 年 10 月 3 日)
  • DT[(flag), ...]相当于DT[flag == TRUE, ...]
  • When fifelse()使用而不是子集通过引用分配, the no参数必须是NA合规。因此,DT[, temp := fifelse(flag, haz_1.5, NA_real_)][]相当于DT[(flag), temp := haz_1.5][]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R data.table 使用 lapply 创建自定义函数来创建和重新分配多个变量 的相关文章

随机推荐

  • Opencv 矩阵乘法

    我需要将矩阵及其转置相乘 但出现以下错误 OpenCV Error Assertion failed type B type type CV 32FC1 type CV 64FC1 type CV 32FC2 type CV 64FC2 i
  • Flutter:任务“:app:compileDebugKotlin”执行失败

    我尝试运行默认的颤动应用程序颤动创建在我的 Android 设备上 但它引发了一个错误 有人可以帮忙吗 在调试模式下在 SM G610F 上启动 lib main dart 运行 Gradle 任务 assembleDebug 失败 构建失
  • 创建 backref 时 SQLAlchemy 关系引发参数错误

    我正在尝试建立一对多的关系 以便每个咖啡馆都可以有很多评论 然而 SQLAlchemy 提出了一个ArgumentError定义关系时 我该如何修复这个错误 class Review db Model id db Column db Int
  • 我可以使用 HTML 输入类型“日期”仅收集年份吗?

    我有一个字段需要从用户那里收集年份 即具有年份分辨率的日期 为了便于存储 我更愿意存储实际的日期值而不是数字 我想使用现代浏览器支持的日期输入 UI 或webshims https afarkas github io webshim dem
  • 删除分组 UITableView 中的角阴影/偏移

    当 UITableViewStyleGrouped 类型的 UITableView 的背景视图是 iPad 上的非默认颜色或图案图像时 圆角会有一条丑陋的额外线条 有点像斜角效果或投影 有谁知道有什么方法可以消除表格底部的多余线条吗 iPa
  • 在新窗口中打开 html 链接,没有浏览器工具栏

    我知道我可以使用 target blank 在新窗口中打开 html 链接 但是 如何隐藏 禁用所有浏览器工具栏 你应该使用window open url to open window name toolbar no
  • 最好的java jabber客户端库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您对 java jabber 库有哪些好的 坏的经历 我有过非常好的经验Smack http www igniterealtime org pr
  • Ruby 是如何实现完全面向对象的?

    所以 我很好奇 Ruby 为什么是一种完全面向对象的语言 我偶然发现了一个我不太清楚的问题 如果我定义一个函数如下 def foo text print text end 我在类之外定义了该函数 那么该函数如何成为对象 我意识到我可以打电话
  • 了解基本的 SQL 查询

    我有一个查询 例如 SELECT tran number FROM table a WHERE customer id IN SELECT customer id FROM table b WHERE customer key 89564
  • 将对象添加到现有对象数组 - JavaScript

    我创建了一个包含 2 个对象的数组 我希望编写一个 添加 函数来动态地将更多人添加到该数组中 您能解释一下为什么下面的 add 函数没有成功地将对象添加到 contacts 数组中吗 var bob firstName Bob lastNa
  • 如何使用 Meteor 执行常见的 FB 操作?

    使用 Meteor 执行常见 Facebook 操作需要执行哪些步骤accounts facebook包裹 我正在尝试获取好友列表 在墙上发布并最终执行其他操作 但我不确定如何继续 更新 对meteor 0 6 0略有修改 您需要使用 AP
  • 来自 Pandas 混淆矩阵的散景热图

    熊猫怎么能DataFrame显示为散景热图 https docs bokeh org en latest docs user guide categorical html heat maps https docs bokeh org en
  • 具有自定义视图和图像视图的 MKAnnotationView

    在我的地图应用程序中 我想显示一个带有图像的彩色背景圆圈 而不是显示图钉 背景圆圈的颜色 下图中的绿色阴影 是动态的 它将如下图所示 我创建了 TCircleView 它在 drawRect 中绘制颜色为了显示类似的注释 我创建了 TCir
  • 如何调试 NodeJS 中的套接字挂起错误?

    我收到以下错误 events js 48 throw arguments 1 Unhandled error event Error socket hang up at createHangUpError http js 1091 15 a
  • nuget.org:无法加载服务索引

    这实际上不是一个重复这个问题 https stackoverflow com questions 41185443 nuget connection attempt failed unable to load the service ind
  • Python OrderedDict 按日期排序

    我正在尝试使用 OrderedDict Raymond Hettingersversion http code activestate com recipes 576693 对于 pre2 7 Python 其中我的键是日期 但是它没有正确
  • 默认字典(无)

    我希望有一本包含一组状态转换的字典 我认为我可以使用 states defaultdict None 来做到这一点 但它没有按我的预期工作 例如 states defaultdict None if new state 1 states S
  • jQuery Tablesorter 的日期排序问题

    我正在尝试对具有类似列的表进行排序2009 12 17 23 59 59 0 我正在使用下面的应用排序 document ready function dataTable tablesorter 但它不适用于 yyyy mm dd 格式的日
  • 比较 numpy.save 和 h5py 的速度时如何获得一致的结果?

    我正在尝试比较两种工具的速度效率 这两种工具可以节省 2 GB 的空间numpy array到磁盘到文件 numpy save and h5py create dataset 注意 这只是第一个测试 我必须处理的真实情况是数千个大小在 1
  • R data.table 使用 lapply 创建自定义函数来创建和重新分配多个变量

    我有以下几行代码 DT flag T temp haz 1 5 DT temp na locf temp na rm FALSE pid DT agedays 61 haz 1 5 1 temp 我需要将其转换为一个函数 以便它可以处理一系