数据表中的条件差异计算

2024-01-09

我有一百万行长data.table大约有20个柜台式的柱子。这些列显示各种存储系统操作的计数器随时间的增加。然而,有时,受监控系统上的计数器会重置,并且单个观测值低于前一个观测值。

我需要计算一个opsdiff列,其中包含基于列的相同类型的后续值的算术差值(预期为正)type。当识别出计数器重置情况时 - 即。差值为负,应使用计数器的实际值。

> dt <- data.table(type=rep(c("a","b"),each=6),opscounter=c(105609,106316,106705,489,723,1250))
> dt
    type opscounter
 1:    a     105609
 2:    a     106316
 3:    a     106705
 4:    a        489
 5:    a        723
 6:    a       1250
 7:    b     105609
 8:    b     106316
 9:    b     106705
10:    b        489
11:    b        723
12:    b       1250

我希望得到的结果:

> dt
    type opscounter     opsdiff
 1:    a     105609          NA
 2:    a     106316         707
 3:    a     106705         389
 4:    a        489         489
 5:    a        723         234
 6:    a       1250         527
 7:    b     105609          NA
 8:    b     106316         707
 9:    b     106705         389
10:    b        489         489
11:    b        723         234
12:    b       1250         527
> 

我试图建立一个基于ifelse()但我不知道如何解决当前行的问题opscounter值在else部分并且既不是双重调用diff()也许是一种有效的用法:

dt[,opsdiff:=c(NA, ifelse(diff(opscounter)>0, diff(opscounter), opscounter)), by=type]

我怎样才能正确计算opsdiff column?


首选解决方案是:

dt[, opsdiff := c(NA, diff(opscounter)), 
   by = type][opsdiff < 0, opsdiff := opscounter][]
#     type opscounter opsdiff
#  1:    a     105609      NA
#  2:    a     106316     707
#  3:    a     106705     389
#  4:    a        489     489
#  5:    a        723     234
#  6:    a       1250     527
#  7:    b     105609      NA
#  8:    b     106316     707
#  9:    b     106705     389
# 10:    b        489     489
# 11:    b        723     234
# 12:    b       1250     527

请注意,我添加了额外的内容[]为了即时打印结果并说明您可以添加其中多个结果。

一般来说,最好避免ifelse(特别是在你有如此大数据集的情况下)它可能会很慢(尽管矢量化),因为它评估两者yes and no cases https://stackoverflow.com/q/16275149/559784。在你的情况下,你发现了另一个“缺陷”,你需要告诉它你想要拉的确切位置opscounterfrom,这增加了复杂性(参见@阿伦斯评论 https://stackoverflow.com/questions/26239328/conditional-difference-calculation-in-data-table#comment41158288_26239328以实现可能的覆盖)。

关于您在评论中提出的问题,data.table表格的操作DT[...]只是调用函数[.data.table(DT, ...)。这并没有什么不同data.frame;有一个类似的功能[.data.frame.

请注意,一个data.table也是一个data.frame. See class(dt)并且还阅读了?data.table.

为了更清楚地说明,在 data.table 中,添加[...]一个接一个地被称为chaining。这是免费的。您也可以在 data.frame 中执行相同的操作(如下所示),但是您可以在 data.frame 上执行的操作data.frame是有限的,因此链接本身的使用与 data.table 不同。

df <- as.data.frame(dt) # or `setDF(dt)` in 1.9.4+ to do this by reference
df[df$type == "a", ][2:3, ]
#   type opscounter
# 2    a     106316
# 3    a     106705

最后,为了说明无效ifelse,这是一个基准:

set.seed(123)
n <- 1e6
dt <- data.table(type = rep(c("a","b"), each = n), 
                 opscounter = sample(1:1e5, n*2, replace = TRUE))


library(microbenchmark)
microbenchmark(
dt[, opsdiff := c(NA, diff(opscounter)), by = type][opsdiff < 0, opsdiff := opscounter],
dt[, opsdiff := c(NA, ifelse(diff(opscounter) > 0, diff(opscounter), tail(opscounter, -1L))), by=type]
)

# Unit: milliseconds
#                                                                                                         expr
#             dt[, `:=`(opsdiff, c(NA, diff(opscounter))), by = type][opsdiff <  0, `:=`(opsdiff, opscounter)]
# dt[, `:=`(opsdiff, c(NA, ifelse(diff(opscounter) > 0, diff(opscounter), tail(opscounter, -1L)))), by = type]
#      min       lq      mean    median        uq       max neval
# 228.0445 255.4006  285.8163  281.1388  307.4195  508.3841   100
# 899.1222 990.1478 1085.5492 1048.3704 1095.7179 1740.5704   100

The ifelse解决方案速度慢约 4 倍。

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

数据表中的条件差异计算 的相关文章

  • 通过另一个函数将数据和列名称传递给 ggplot

    我将直接跳到一个示例并在后进行评论 cont lt data frame value c 1 20 variable c 1 20 1 20 1 5 1 20 2 group rep c 1 2 3 each 20 value variab
  • 将 RMarkdown 文档编织为 Word 时方程式和引用丢失

    我不确定这个问题是否更适合LaTeX论坛 我将其发布在这里是因为我怀疑问题更多是关于knitr和 RMarkdown 相比于 LaTeX 我在 RStudio 中有以下 RMarkdown 文档 title Capricious Behav
  • mutate() 尝试在使用美元符号运算符时使用全局变量的值进行提取

    我使用得到了有趣的结果mutate with a 当全局环境中碰巧存在与要提取的元素同名的变量时进行提取 我正在运行 R 3 1 3 和 dplyr 0 4 3 9 这工作正常 library dplyr df lt data frame
  • 成对散点图;一对多[重复]

    这个问题在这里已经有答案了 有没有一种简洁的方法来创建pairs仅将一个变量与许多其他变量进行比较的图 换句话说 我可以只绘制标准的一行或一列吗 pairs不使用循环的散点图矩阵 融化你的数据 然后使用带有facet的ggplot libr
  • 在ggplot2中绘制大多边形地图的小区域

    我有一个 shapefile 我使用它在 ggplot2 中进行了强化和绘制geom polygon 我怎样才能只绘制这张地图的一小部分区域 我的完整地图看起来不错 但我的小区域很混乱 这是一个工作示例 这个小形状文件可以从以下位置获得 h
  • 难以理解 R 中双括号和单括号子集之间的区别[重复]

    这个问题在这里已经有答案了 我很难理解双括号子集和单括号子集之间的区别 我在开源编程方面相当陌生 我很难理解 R 中的 help 函数 因为考虑到我目前对 R 的理解 其中的一些信息对我来说太技术性了 我尝试过谷歌搜索差异 虽然它给了我一个
  • 使用shinyjs通过javascript在闪亮的应用程序中操作现有的Leaflet地图

    我有一个闪亮的应用程序 其中包含现有的传单地图 我希望能够在渲染后使用自定义 javascript 通过shinyjs包裹 一个最小的例子如下 app R packages library dplyr library leaflet lib
  • 将公式传递给 R 中的函数?

    对此的任何帮助将不胜感激 我正在使用 Lumley 调查包 并试图简化我的代码 但遇到了一些小障碍 在我的代码中调用包中的 svymean 函数如下 其中第一个参数是指示我想要哪些变量的公式 第二个参数是该数据集 svymean hq eh
  • 提取模型摘要并将其存储为新列

    我是新来的purrr范例并正在努力解决它 根据一些来源 我已经设法嵌套一个数据框 在嵌套数据上运行线性模型 从每个 lm 中提取一些系数 并为每个 lm 生成摘要 我想做的最后一件事是从摘要中提取 r squared 我原以为这将是我想要实
  • 有什么方法可以访问 makeActiveBinding 安装的函数吗?

    标题基本上说明了一切 如果我这样做 makeActiveBinding x function runif 2 GlobalEnv x 1 0 7332872 0 4707796 x 1 0 5500310 0 5013099 那我有什么办法
  • 拆分并保存在新的 data.frames 中

    我有一个大 data frame 144 列 我想将其分成每组 3 列 子文件或子 data frame 然后将子 data frame 保存在单独的文件中 换句话说 file1 将包含从 1 到 3 的列 file2 将包含从 6 到 9
  • 直接来自数据的马尔可夫模型图(makovchain 或 deemod 包?)

    我想读取一堆因子数据并从中创建一个可以很好地可视化的转换矩阵 我发现了一个非常好的软件包 称为 heemod 它与 diagram 一起工作得不错 对于我的第一个快速而肮脏的方法 我运行了一段 Python 代码来获取矩阵 然后使用这个 R
  • 是否有 R 函数可以将这些数据从长形重塑为宽形?

    数据现在看起来如何 Coach ID Student score 1 A 8 1 B 3 2 A 5 2 B 4 2 C 7 看起来像这样 Coach ID Student score student 2 score 2 student 3
  • 如果我有一个包含计数的表格,如何获得直方图/摘要统计数据? [复制]

    这个问题在这里已经有答案了 我习惯了像这样的观察向量c 1 1 1 3 4 我可以在上面看到汇总统计数据和绘制直方图等 但现在我发现自己拥有相同的数据 但采用如下压缩格式 value numObs 1 3 3 1 4 1 当数据以data
  • 挖泥机子集 (MuMIn) - 如果存在主效应,则必须包括交互作用

    我正在使用 dredge MuMIn 进行一些探索性工作 在此过程中 我想将两个变量设置为仅当它们之间存在相互作用时才允许一起出现 即它们不能仅作为主要效果一起出现 使用样本数据 我想挖掘模型 fm1 尽管它可能没有意义 如果变量 GNP
  • 列值的切换功能

    我有一个缩写变量 名称错误地分散在整个列表中 请参阅下面的示例结构 ID lt c SPW SM DLS SJ joe schmoe CEJ teddy roos GVF MJC LH sally fields Full names sho
  • 将儒略日期转换为 PosixCt 日期

    我发现自己在解决这个问题 我需要将 R 中的儒略日期转换为正常日期 YYYY MM DD 我知道我可以指定as Date julian date origin 但我不知道应该提供哪个来源 我的朱利安日期类似于 2458010 2458011
  • R 中带有变音符号的字符列表

    我试图将字符串中的电话 字符 出现次数制成表格 但变音符号单独作为字符制成表格 理想情况下 我有一个国际音标的单词列表 其中包含大量变音符号以及它们与基本字符的几种组合 我在这里给出了仅包含一个单词的 MWE 但对于单词列表和更多类型的组合
  • 在前两个冒号上分割字符串

    我想在前两个冒号上拆分一列字符串 但不在任何后续冒号上拆分 my data lt read table text my string some data 123 34 56 78 100 87 65 43 21 200 a4 b6 c888
  • 在 R 的 stargazer 表中设置注释格式

    我在用stargazer包来生成 回归输出 表 一切都在奇迹般地进行 直到我开始编辑笔记 First 换行很难 但是 Bryansuggests https stackoverflow com questions 21720264 star

随机推荐

  • SimpleDateFormat 解析需要一小时(夏季使用 RFC 1123,GMT)

    我使用 SimpleDateFormat 和 RFC 1123 来格式化日期并解析日期 但是 parse format date 有时与原始日期相差一小时 代码如下 public static void main String args t
  • 获取数组中的所有组合

    假设我有以下数组 var arr new A B C 我怎样才能产生仅包含两个字符且没有两个相同字符的所有可能组合 例如AB会是一样的BA 例如 使用上面的数组将产生 AB AC BC 请注意 该示例已被简化 所需的数组和字符串的长度会更大
  • 锁定/解锁设备时相机示例错误

    我正在使用相机 并且使用文档中给出的完全相同的示例 http developer android com resources samples ApiDemos src com example android apis graphics Ca
  • 转换播放!从 MySQL 到 PostgreSQL 的框架演变

    我正在使用 plaframework 2 2 1 我做了一个项目 MySQL 但现在我想将我的项目转移到 PostgreSQL 但在重新创建数据库演变时遇到了一些错误 我的 mysql 的旧演变 1 sql 运行良好是 Created by
  • 如何设置绑定到Textbox的Label的可见性?

    我有三个绑定到标签的文本框 当我在文本框中键入内容时 文本框文本值将设置为标签 问题是我想在文本框为空白时将标签的可见性设置为折叠 反之亦然 如何在 WPF 中使用 Visibility Convert 来做到这一点 在 XAML 文件中
  • Angular2 使用 @Inputs 和 s

    我的页面中有一个子导航 它在公共主视图下方显示一些子视图 我想通过将一个对象传递给子视图
  • 查找两个列表中都不存在的对象的最佳方法

    我正在开发一个模块 该模块依赖于检查两个列表中是否存在不存在的任何对象 该实现应该是用Python 实现的 考虑简化的对象 def class Foo object def init self attr one None attr two
  • 使用带有 Font Awesome 的数字

    我想使用数字列出流程中的步骤 我很好奇如何使用 Font Awesome 来做到这一点 我想使用带有 1 2 3 的圆圈 这可能吗 Font Awesome 会在图标列表中添加数字吗 Thanks 字体真棒实际上有内置支持 https fo
  • Android 工作室:NoClassDefFoundError 与 java.util.Base64

    抱歉 我扫描了许多听起来相似的问题 但没有一个对我有帮助 我正在运行 Android Studio 3 0 1 我是新手 我正在遵循在线教程 HelloWorld 程序 但随后添加了对 java util Base64 getDecoder
  • 运算符 new 将内存初始化为零

    有这样的代码 include
  • 如何在 Android 中将 ImageButton 与背景图像正确对齐?

    在使用 XML 的 Android UI 设计中 如何将 ImageButton 与 Activity xml 文件的背景完全对齐 假设我有两张图像 一张用作活动的背景图像 第二张用作图像按钮源 这是背景图像 https i stack i
  • 如何在 Python 中获得人类可读的时区名称?

    在我正在从事的一个Python项目中 我希望能够获得以下形式的 人类可读 时区名称美洲 纽约 对应系统本地时区 显示给用户 我见过的每一段访问时区信息的代码都只返回数字偏移量 0400 或字母代码 EDT 有时两者都返回 是否有一些 Pyt
  • NEAT 错误 - AttributeError:“tuple”对象没有属性“connections”

    我目前正在尝试创建一个 NEAT 算法来解决 FlappyBird 但在运行我的代码时遇到错误 参见标题 目前我已经设置了我的run功能和我的eval genomes功能 我已经简化了它们以删除pygame并试图将其保留在neat pyth
  • 如何使用vba禁用单元格中的更改?

    我正在使用以下代码 此代码的示例如下 如果我在单元格 A1 中输入任何值 单元格 B1 将显示时间戳 Private Sub Worksheet Change ByVal Target As Excel Range With Target
  • “单例”工厂,好还是坏?

    我有很多 抽象 工厂 它们通常作为单例实现 通常是为了方便 不必将它们传递给实际上与使用或了解这些工厂无关的层 大多数时候我只需要在启动时决定哪个工厂实现其余的代码程序 也许通过一些配置 它看起来例如喜欢 abstract class Co
  • 使用 Mips Assembly 读取和打印 txt 文件中的内容

    我正在尝试读取并打印 txt 文件中的内容 稍后我还想从 mips 读取转储的文件 我看到代码 看起来没问题 但没有输出任何内容 data myFile asciiz teste txt filename for input buffer
  • 从 RecyclerView 中删除行

    我在这篇文章的帮助下以某种方式实现了 recyclerview 现在我的要求是在运行时从此回收视图中删除一行 link http treyrobinson net blog android l tutorials part 3 recycl
  • 首先使用 Entity Framework 6.0 代码创建与 LINQPad 的 DbContext 连接时出现问题

    我正在使用 LINQPad v4 51 03 并尝试从 Entity Framework 6 0 6 1 1 中的代码优先实现创建 DbContext 连接 public partial class MyEntities DbContext
  • Google Apps 脚本 - 单元格中的 .setValue 基于 for 循环匹配

    我试图从数据范围中获取值 循环数据 匹配该数据中的值 然后根据匹配值更新位于几列上方的单元格 我能够找到要匹配的值 但我很难理解如何更新几列的单元格 下面是我到目前为止得到的代码 减去 setValue 部分 var trackingSS
  • 数据表中的条件差异计算

    我有一百万行长data table大约有20个柜台式的柱子 这些列显示各种存储系统操作的计数器随时间的增加 然而 有时 受监控系统上的计数器会重置 并且单个观测值低于前一个观测值 我需要计算一个opsdiff列 其中包含基于列的相同类型的后