data.table中按组填充缺失值

2023-12-04

如果想要根据一组内的前/后非 NA 观察来填充变量的缺失值,则 data.table 命令是

setkey(DT,id,date)
DT[, value_filled_in := DT[!is.na(value), list(id, date, value)][DT[, list(id, date)], value, roll = TRUE]]

这是相当复杂的。自从那以后就很遗憾了roll是一个非常快速且强大的选项(特别是与应用诸如zoo::na.locf每组内)

我可以编写一个方便的函数来填充缺失值

   fill_na <-  function(x , by = NULL, roll =TRUE , rollends= if (roll=="nearest") c(TRUE,TRUE)
             else if (roll>=0) c(FALSE,TRUE)
             else c(TRUE,FALSE)){
    id <- seq_along(x)
    if (is.null(by)){
      DT <- data.table("x" = x, "id" = id, key = "id") 
      return(DT[!is.na(x)][DT[, list(id)], x, roll = roll, rollends = rollends, allow.cartesian = TRUE])

    } else{
      DT <- data.table("x" = x, "by" = by, "id" = id, key = c("by", "id")) 
      return(DT[!is.na(x)][DT[, list(by, id)], x, roll = roll, rollends = rollends, allow.cartesian = TRUE])
    }
  }

然后写

setkey(DT,id, date)
DT[, value_filled_in := fill_na(value, by = id)]

这并不是很令人满意,因为有人想写

setkey(DT,id, date)
DT[, value_filled_in := fill_na(value), by = id]

然而,这需要大量的时间来运行。而且,对于最终用户来说,了解这一点很麻烦fill_na应该用by选项,并且不应与data.table by。有没有一个优雅的解决方案?

一些速度测试

N <- 2e6
set.seed(1)
DT <- data.table(
         date = sample(10, N, TRUE),
           id = sample(1e5, N, TRUE),   
        value = sample(c(NA,1:5), N, TRUE),
       value2 = sample(c(NA,1:5), N, TRUE)                   
      )
setkey(DT,id,date)
DT<- unique(DT)

system.time(DT[, filled0 := DT[!is.na(value), list(id, date, value)][DT[, list(id, date)], value, roll = TRUE]])
#> user  system elapsed 
#>  0.086   0.006   0.105 
system.time(DT[, filled1 := zoo::na.locf.default(value, na.rm = FALSE), by = id])
#> user  system elapsed 
#> 5.235   0.016   5.274 
# (lower speed and no built in option like roll=integer or roll=nearest, rollend, etc)
system.time(DT[, filled2 := fill_na(value, by = id)])
#>   user  system elapsed 
#>  0.194   0.019   0.221 
system.time(DT[, filled3 := fill_na(value), by = id])
#>    user  system elapsed 
#> 237.256   0.913 238.405 

为什么我不直接使用na.locf.default?尽管速度差异并不是很重要,但其他类型的 data.table 命令(那些依赖于“by”中的变量合并的命令)也会出现同样的问题 - 系统地忽略它们以获得更简单的语法。我也非常喜欢所有的滚动选项。


现在有一个本土的data.table填充缺失值的方法(截至1.12.4).

这个问题催生了一个githubissue最近随着函数的创建而关闭nafill and setnafill。您现在可以使用

DT[, value_filled_in := nafill(value, type = "locf")]

也可以填写NA具有恒定值或带回的下一个观察结果。

与问题中的方法的一个区别是,这些函数目前仅适用于NA not NaN然而is.na is TRUE for NaN- 这是planned通过额外的参数在下一个版本中修复。

我没有参与该项目,但我看到虽然 github 问题链接到这里,但没有其他链接,所以我代表未来的访问者回答。

更新:默认NaN现在的待遇与NA.

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

data.table中按组填充缺失值 的相关文章

  • 如何更新条件公式?

    让我直接进入示例 考虑以下等式 frml lt formula y a b x z 使用这样的公式规范 例如和AER ivreg 我想更新这个公式 使其显示为 frml2 lt y a b c x z w 但是 我不确定如何更新条件标志之前
  • 使用 dplyr:group_by 将数据帧分成多个子集?

    有没有办法根据 group by 组使用 dplyr 将一个数据帧拆分为数据帧的子集 mtcars gt group by cyl gear gt codes 非常感谢 好吧 并不是你真的想要 但你可以这样做tidyr 即nearly一样的
  • R 中的发散积分可在 Wolfram 中求解

    我知道我以前问过同样的问题 但由于我是新来的 这个问题问得不好而且不可重现 因此我在这里尝试做得更好 如果我只编辑旧的 可能没有人会读它 我有一个想要积分的二重积分 ff lt function g t exp 16 g exp 8 t t
  • R.matlab/readMat:readTag(this) 中出错

    我正在尝试使用 R matlab 将 matlab 文件读入 R 但遇到此错误 require R matlab r lt readMat file mat verbose T Trying to read MAT v5 file stre
  • 从 R 中的 HTTPS 连接逐行读取

    当创建连接时open r 它允许逐行读取 这对于批量处理大数据流非常有用 例如这个脚本 https gist github com jeroenooms d33a24958d99bb969ac0通过一次读取 100 行来解析相当大的 gzi
  • R 更改小数位且不四舍五入

    gt signif 1 89 digits 2 1 1 9 我想要1 8 这有点笨拙 但它会起作用并保持所有数字 x lt 1 829380 trunc dec lt function x n floor x 10 n 10 n Resul
  • 将函数应用于 3d 数组的每一层,返回一个数组

    假设您有一个包含行 列和层的 3 维数组 A lt array 1 27 c 3 3 3 想象你有一个函数 它接受一个矩阵作为输入并返回一个矩阵作为输出 就像t 如何将该函数应用于数组的每一层 返回与第一层大小相同的另一个数组 我觉得我应该
  • 为绘图制作 2D 图例 - 双变量分区统计图

    我一直在玩双变量 choropleth 地图 并且一直在如何创建类似于 2d 图例的问题上陷入困境约书亚 史蒂文斯 http www joshuastevens net cartography make a bivariate chorop
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • C# 问题:加载 .MDB 文件、对其进行更改并将更改保存回原始文件的最简单方法是什么?

    我正在进行的项目即将完成 我正在加载一个 MDB 文件 在 DataGrid 上显示内容 并尝试在 DataGrid 上获取这些更改并将它们保存回 MDB 文件中 我还将创建一个函数 允许我从一个 MDB 文件中获取表并将其保存到另一个 M
  • glmnet 未从 cv.glmnet 收敛 lambda.min

    我跑了20倍cv glmnet套索模型以获得 lambda 的 最佳 值 但是 当我尝试重现结果时glmnet 我收到一个错误 内容如下 Warning messages 1 from glmnet Fortran code error c
  • 使用 R 进行项目组织 [重复]

    这个问题在这里已经有答案了 可能的重复 统计分析和报告撰写的工作流程 https stackoverflow com questions 1429907 workflow for statistical analysis and repor
  • R - 通过覆盖和递归合并列表

    假设我有两个带有名字的列表 a list a 1 b 2 c list d 1 e 2 d list a 1 b 2 b list a 2 c list e 1 f 2 d 3 e 2 我想递归地合并这些列表 如果第二个参数包含冲突的值 则
  • 在 R 中使用 Huggingface Transformer 模型

    我正在尝试在 R 中使用不同的 Huggingface 模型 这是通过 reticulate 导入 Transformer 包来实现的 谢谢 https rpubs com eR ic transfoRmers https rpubs co
  • 如何将 ggrough 图表另存为 .png

    说我正在使用R包裹ggrough https xvrdm github io ggrough https xvrdm github io ggrough 我有这个代码 取自该网页 library ggplot2 library ggroug
  • 单击 R 中的 Sankey Chart 线时添加额外的标签值

    以下 R 闪亮脚本创建一个桑基图 如下面的快照所示 我的要求是 当我单击左右节点之间的任何链接 即 a1 和 a2 时 我希望相应的 a3 的总和出现在标签中 例如 a1 中的 A 和 a2 中的 E 总共具有值 50 和 32 因此 我想
  • 检查单词是否存在于英语词典 r 中

    我正在对多个进行一些文本分析resume生成一个wordcloud using wordcloud包装连同tm用于在 R 中预处理文档语料库的包 我面临的问题是 检查语料库中的单词是否具有某种含义 即 它属于英语词典 如何一起挖掘 处理多份
  • 捕获段错误、内存未映射错误

    我试图在 R 中找到 1347 x 209974 矩阵的列的相关性 每次我这样做 使用一个简单的命令cor matrix 我收到消息 caught segfault address 0xffffffffd058abf8 cause memo
  • 根据R中的前一行和当前行按组计算

    我可以根据 R 中的前一行和当前行进行计算 对于此数据框 df A B 1 2 2 2 2 3 3 4 5 5 B2 A2 0 5 B1 我可以使用这段代码来计算这个函数 for i in 2 nrow df B i lt 1 2 B i
  • 在 R 中使用 nls 重新创建研究

    我正在学习如何在 R 中使用 nls 函数 但遇到了一些问题 我现在只是试图重新创建研究论文中发现的曲线 该模型拟合了 1987 年崩盘前股市走势的曲线 我定义了一个函数func 如下 func lt function a b tc t a

随机推荐

  • 在我自己的服务器上部署应用程序,地址中不包含端口号

    我已经使用 R 和闪亮服务器建立了自己的服务器 并且已经在上面放置了一些应用程序 但是 所有应用程序都有一个端口号 例如 3838 in blahblah com 3838 app name 如果我未来的计划是使用闪亮构建整个网站 这看起来
  • 如果我重新安装应用程序,我的应用程序的辅助功能服务将无法正常工作

    如果在卸载应用程序之前我没有取消选中 设置 gt 辅助功能 下的辅助功能服务选项 则辅助功能服务不会与我的应用程序绑定 笔记 为了让它再次工作 我需要重新启动我的手机 任何人都可以建议我如何在不禁用辅助功能服务的情况下安全地重新安装我的应用
  • 如何与java中的字符串日期格式进行比较?

    我收到两种类型的输入 1 String date1 07 01 2017 2 String date2 2017 01 12 00 00 00 0 如何比较两种日期格式 如果我得到的格式为 date1 我想执行一项功能 如果我得到 date
  • 应用程序加载器报告缺少代码签名证书

    I am developing my App in xamarin studio I want the solution for xamarin Ios app not on xcode I produce screenshots abou
  • 有没有办法在 Hive CREATE TABLE 语句本身中指定传入数据的日期/时间戳格式?

    我有一个 CSV 文件 其中包含以下格式的日期和时间戳值 例如 Col1 col2 01JAN2019 01JAN2019 17 34 41 但是 当我在 create 语句中将 Col1 定义为 Date 将 Col2 定义为 Times
  • SCHED_OTHER/SCHED_FIFO 的 pthread sched_get_priority_min/max 实现

    我正在尝试为我正在从事的项目编写一个半可移植线程类 在尝试设置线程的优先级时 我遇到了 pthread 世界中的一个难题 给出以下代码 include
  • AEM 6.1 使用的 Ext JS 版本

    AEM 6 1 使用哪个版本的 Ext JS 库 有没有直接的方法 控制台可以找到这个问题 It uses v3 4 0ExtJS 的基础上构建了 AEM Widget 库 您可以在以下位置找到详细信息 libs cq ui widgets
  • 如何将绘制的线保留在补丁下方

    在下面的代码中 我绘制了一条线 然后在其上方绘制了一个不透明补丁 alpha 1 我希望被补丁覆盖的线部分被隐藏 但看起来好像线是在补丁之后绘制的 如何更改 使线条不显示出来 该代码改编自这个 matplotlib 示例 import ma
  • Android:将视图投射到视图

    我有一个扩展视图的类 MyView 扩展视图 在活动中我有下一个 View view View findViewById R id relative layout view here I have error because of cast
  • 如何检查R中函数的所有参数

    通常在 R 参数列表中包的 html 帮助中 以结尾 其他论点通过 但是我们如何在 R 中打印函数的所有参数 如果我正确理解你的问题 那么我倾向于说 大多数时候 不可能列出所有可能通过的参数 函数的 部分 请看一下非常简单的 plot功能
  • 如何获取 std::string 的准确长度?

    我正在修剪长条std string使用此代码将其放入文本容器中 std string AppDelegate getTrimmedStringWithRange std string text int range if text lengt
  • 这个Python装饰器是如何工作的?

    编辑 澄清以使我的问题具体到我的查询 我可以看到装饰器静态日志函数是如何调用的 但我不知道如何调用 被调用以及它的结果如何是log的结果 我看到了输入 输入内容是如何工作的 class logger staticmethod def log
  • 使用 python requests 模块在 Github 中创建经过身份验证的会话

    我的目标是在 github 中创建一个经过身份验证的会话 以便我可以使用高级搜索 这将功能限制为未经身份验证的用户 目前 我收到来自发布请求的网页响应 什么 您的浏览器执行了意外操作 如果问题仍然存在 请联系我们 这是我用来尝试完成我的任务
  • 随机数,分布不均匀[重复]

    这个问题在这里已经有答案了 可能的重复 生成密度不均匀的随机数 我尝试识别 创建一个函数 在 Java 中 它给我一个非均匀分布的数字序列 如果我有一个函数说function f x and x gt 0它会给我一个随机数 从0 to x
  • 如何确保从抽象泛型类派生的类使用自身作为泛型参数

    我有一个抽象类 public abstract class MyAbstractBase
  • 检查字符串的第一个字母是否为大写

    我想创建一个函数来检查字符串的第一个字母是否为大写 这是我到目前为止所想出的 def is lowercase word if word 0 in range string ascii lowercase return True else
  • Node.js、bluebird、执行路径控制不佳

    我正在努力学习蓝鸟 我没有按照自己的意愿控制执行 这个蓝鸟问题来自 async js 问题Node js 异步模块 并发 这是一些代码 加上我期望得到的和我得到的 问题 为什么 3 函数在 1 1 和 2 函数结束以及 2 第一个错误检查函
  • 更改日期格式

    我有一个 DateTime 变量 例如时间戳 它以通常的格式保存日期 如下所示 11 1 2011 该变量用于构建 SQL 命令 Oracle数据库只接受以下格式的日期 YYYY MM DD 如何操作我的变量以这种格式存储日期 根本不要格式
  • 底部导航视图中所选选项卡的颜色

    我正在添加一个BottomNavigationView到一个项目 我想为选定的选项卡使用不同的文本 和图标色调 颜色 以实现灰显未选定的选项卡效果 使用不同的颜色android state selected true 在颜色选择器资源文件中
  • data.table中按组填充缺失值

    如果想要根据一组内的前 后非 NA 观察来填充变量的缺失值 则 data table 命令是 setkey DT id date DT value filled in DT is na value list id date value DT