各组最新值的总和

2024-02-24

对于我的每一行数据,我想计算最近的总和value对于每个group:

dt = data.table(group = c('a','b','a','a','b','a'),
                value = c(10, 5, 20, 15, 15, 10),
                desired = c(10, 15, 25, 20, 30, 25))
#   group value desired
#1:     a    10      10
#2:     b     5      15
#3:     a    20      25  # latest value of a is 20, of b is 5
#4:     a    15      20  # latest value of a is 15, of b is 5
#5:     b    15      30
#6:     a    10      25

desired列是我想要实现的,我可以通过一个简单的循环来实现这一点,但是我的数据非常大,有很多行和组(1M + 行,1000 + 组)。

for (i in seq_len(nrow(dt))) {
  # can use `set` to make this faster, but still too slow
  # this is just to illustrate *a* solution
  dt[i, desired1 := dt[1:i, value[.N], by = group][, sum(V1)]]
}

来自@eddi(在评论下)的更简单的逻辑减少了如下所示的迂回:

dt[, incr := diff(c(0, value)), by = group][, ans := cumsum(incr)]

不确定它如何扩展到更多组,但这里有一个包含 3 个组的示例数据:

# I hope I got the desired output correctly
require(data.table)
dt = data.table(group = c('a','b','c','a','a','b','c','a'),
                value = c(10, 5, 20, 25, 15, 15, 30, 10),
                desired = c(10, 15, 35, 50, 40, 50, 60, 55))

Add an rleid:

dt[, id := rleid(group)]

提取每个的最后一行group, id:

last = dt[, .(value=value[.N]), by=.(group, id)]

last将会有独特的id。现在的想法是获得每个的增量id,然后加入+更新回来。

last = last[, incr := value - shift(value, type="lag", fill=0L), by=group
          ][, incr := cumsum(incr)-value][]

立即加入+更新:

dt[last, ans := value + i.incr, on="id"][, id := NULL][]
#    group value desired ans
# 1:     a    10      10  10
# 2:     b     5      15  15
# 3:     c    20      35  35
# 4:     a    25      50  50
# 5:     a    15      40  40
# 6:     b    15      50  50
# 7:     c    30      60  60
# 8:     a    10      55  55

我还不确定这在哪里/是否会中断..现在会仔细查看。我立即写下来,以便有更多的目光。


将 500 个组和 10,000 行与 David 的解决方案进行比较:

require(data.table)
set.seed(45L)
groups = apply(matrix(sample(letters, 500L*10L, TRUE), ncol=10L), 1L, paste, collapse="")
uniqueN(groups) # 500L
N = 1e4L
dt = data.table(group=sample(groups, N, TRUE), value = sample(100L, N, TRUE))

arun <- function(dt) {

    dt[, id := rleid(group)]
    last = dt[, .(value=value[.N]), by=.(group, id)]
    last = last[, incr := value - shift(value, type="lag", fill=0L), by=group
              ][, incr := cumsum(incr)-value][]
    dt[last, ans := value + i.incr, on="id"][, id := NULL][]
    dt$ans
}

david <- function(dt) {
    dt[, indx := .I]
    res <- dcast(dt, indx ~ group)
    for (j in names(res)[-1L]) 
        set(res, j = j, value = res[!is.na(res[[j]])][res, on = "indx", roll = TRUE][[j]])
    rowSums(as.matrix(res)[, -1], na.rm = TRUE)

}

system.time(ans1 <- arun(dt))  ## 0.024s
system.time(ans2 <- david(dt)) ## 38.97s 
identical(ans1, as.integer(ans2))
# [1] TRUE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

各组最新值的总和 的相关文章

  • ggplot 按因子和梯度颜色

    我正在尝试绘制一个对两个变量 一个因子和一个强度 进行着色的图 我希望每个因素都是不同的颜色 并且我希望强度是白色和该颜色之间的渐变 到目前为止 我已经使用了诸如对因子进行分面等技术 将颜色设置为两个变量之间的相互作用 并将颜色设置为因子并
  • 从 leafletProxy() 返回渲染的传单地图

    是否可以在渲染后在 Shiny 中检索传单地图 下面是一个代码示例 展示了如何生成地图leaflet 与返回的不同leafletProxy 即使它们在渲染时看起来完全相同 是否有一个功能可能不同于leafletProxy 获取实际的 htm
  • 如何在R中安装pivot_long()和pivot_wide()

    如果您想尝试这些新功能 pivot wide and pivot long 需要安装开发版tidyr devtools install github tidyverse tidyr 但我还没有实现它 我安装了一系列库 除了一个之外 vctr
  • 在 R 中计算大矩阵的零空间

    我找不到任何函数或包来计算 a 的零空间或 QR 分解 bigmatrix from library bigmemory 在 R 中 例如 library bigmemory a lt big matrix 1000000 1000 typ
  • e_facet 在 echarts4r 问题中使用分组数据

    我真的很喜欢这个包提供的可能性 并且想在一个闪亮的应用程序中使用它 然而我正在努力重新创建从 ggplot 到 echarts4r 的情节 library tidyverse library echarts4r data tibble ti
  • Rcpp 包不包含 Rcpp_precious_remove

    我一直在尝试创建数据库并安装 DBI 包 但仍然遇到此错误 我重新安装了 DBI 和 RSQLite 软件包 但它们似乎不起作用 library DBI con lt dbConnect RSQLite SQLite dbname memo
  • GLMER 警告:方差-协方差矩阵 [...] 不是正定的或包含 NA 值

    我有时发现我的 GLMM 来自glmer 包裹lme4 当调用其摘要时显示以下警告消息 Warning messages 1 In vcov merMod object use hessian use hessian variance co
  • 按新年拆分日期行

    我有来自一家医院的包含许多变量的数据 以及每行的起始日期和截止日期 这告诉我们每行何时 有效 每行的有效期最长为一年 test data frame ID c 10 10 10 12 12 Disease c P P P D P Pass
  • “x[] <- as.integer(x)”是什么意思

    当我阅读 R 手册时 我遇到了如下代码行 从 R 手册中的 colSums 复制 x lt cbind x1 3 x2 c 4 1 2 5 dimnames x 1 lt letters 1 8 x lt as integer x 有人能告
  • ggplot2 方面的内部排序

    我正在尝试在 ggplot2 中绘制一个方面 但我很难使不同方面的内部顺序正确 数据如下 head THAT EXT ID FILE GENRE NODE 1 CKC 1823 01 CKC Novels better 2 CKC 1824
  • 消除垂直线ggplot

    这个问题以前曾被问过 但答案并不总是明确或很复杂 我希望 ggplot2 的新版本能够带来更简单的解决方案 如何仅消除 ggplot 的垂直线而不消除轴刻度线或标签 这对于条形图来说确实很好 因为它可以消除图形中一些不必要的干扰 这里有一些
  • 更快地评估从右到左的矩阵乘法

    我注意到以二次形式评估矩阵运算右到左明显快于左到右在 R 中 取决于括号的放置方式 显然它们都执行相同的计算量 我想知道为什么会这样 这与内存分配有什么关系吗 A 5000 5000 B 5000 2 A matrix runif 5000
  • R - 加速近似日期匹配。 idata.frame?

    我正在努力有效地执行两个数据帧之间的 关闭 日期匹配 这个问题探索了一个解决方案 使用idata frame来自plyr包 但我也对其他建议的解决方案感到非常满意 这是两个数据框的非常简单的版本 sampleticker lt data f
  • 通过 boot.ci 函数获取多个统计数据的 Bootstrap 置信区间

    我想通过以下方式获得多个统计数据的引导置信区间boot ci功能 这是我的 MWE 我有两个统计数据out并想要找到这两个统计数据的引导置信区间 然而 boot ci函数仅为第一个统计量 t1 提供引导置信区间 但不为第二个统计量 t2 提
  • 在 dplyr 中,setdiff 和 anti_join 之间的本质区别是什么?

    我仍在学习 DataCamp for R 的课程 所以如果这个问题看起来很幼稚 请原谅我 考虑以下 非常做作的 示例 library dplyr library tibble type lt c Dog Cat Cat Cat name l
  • ggplot:如何检索轴标签的值?

    如何提取下面的 ggplot 中用于标记 y 轴和 x 轴的数字 分别为20 30 40 and 10 15 20 25 30 35 Plot From r 统计公司 http r statistics co Top50 Ggplot2 V
  • 如何计算由离散数据定义的表面下的体积?

    我需要确定由离散数据点表示的一系列表面下方的体积 在我的数据中 每个样本都作为数据帧列表中的单独数据帧存储 这是一些 小 示例数据 df1 lt data frame x c 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 y
  • 如何与 R 包 sf 进行“完整”联合

    我尝试使用三个多边形之间的并集sf st union 下图中显示了 ArcGIS Overlay Union All 的结果 我希望通过使用 R 中的 sf 包获得与 OUTPUT 中五个不同多边形类似的结果 library sf a1 l
  • 读取r中不同目录中的多个文件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想从不同的目录读取多个 csv 文件 然后将其放入单个数据框中 我有两种目录可供阅读 A LogIIS 文件夹01 文件 csv 在
  • ValueError:在 R 中使用 keras 模型时在用户代码中

    我正在尝试使用 R 在 R 中运行一维 CNNkeras包裹 我正在使用以下代码 library MASS library keras Create some data data Boston data lt Boston create a

随机推荐

  • 用户输入验证,强制字符串仅包含字母

    我试图在我的方法之一中创建一个用户输入验证系统 它在一定程度上工作正常 但是尽管有代码 它仍然允许整数作为有效输入 我不希望它成为这样 我怎么能更改此代码 仅允许字母 字符串 作为有效输入 我在这一点上感到困惑 我尝试了这个系统的整数 它工
  • jQuery 浏览器兼容性 (IE)

    由于我试图向您展示的源代码相当长且复杂 因此我只是提供一个指向我遇到问题的页面的链接 http www thesportinghub com lms make my picks http www thesportinghub com lms
  • 将一个元素绑定到两个源

    我目前有两个接受任何数字的文本框 我有一个文本块 它接受输入的两个数字并计算平均值 我想知道是否有一种方法可以将此文本块绑定到两个文本框并利用自定义转换器来计算平均值 我目前正在捕获两个文本框中的文本更改事件并以这种方式计算平均值 但我假设
  • 没有安装的配置文件与安装的 iOS 代码签名密钥匹配

    当我选择 iphone 设备并构建时 它显示 xamarin ios 的错误 错误 555 没有安装的配置文件与安装的 iOS 代码签名密钥匹配 请帮助解决这个问题 尝试以下步骤重新安装证书和配置文件 去苹果会员中心 http develo
  • 如何使用 Spring JPA 对 jsonb 列进行查询?

    我正在使用 Spring JPA 和 PostgreSQL 数据库 我有一个实体如下 Entity TypeDef name json binary typeClass com vladmihalcea hibernate type jso
  • 更改 Kivy 中按钮的背景颜色

    我是 Kivy 的新手 在指定按钮的背景颜色时遇到困难 这是我的简单例子 custombutton py from kivy app import App from kivy uix widget import Widget class M
  • 获取 .Net 中 CryptoStream 的长度

    我正在开发加密 解密文件的软件 我希望能够猜测加密后数据的长度 但我无法使用 CryptoStream Length 它会抛出 NotSupportedException 有什么办法可以猜出来吗 我正在使用 RijndaelManaged
  • 带有尾部斜杠的奇怪 Nginx 行为

    我有一个非常有趣的行为 我想避免在我的网站上的 URL 中出现尾随斜杠 我已经把rewrite 1 permanent 规则进入我的服务器块 所以 https example com something https example com
  • C# 命名管道流 readline 挂起

    我很困惑 我有命名管道的客户端 服务器结构 问题出在某个随机点 经过一段时间的工作后 它只是挂在streamReader ReadLine 上 它只是停下来 不再继续 我很困惑 我根本不知道发生了什么 也不知道如何调试它 为什么以及何时发生
  • 使用VBA将字符串分成Excel中的不同单元格

    例如 我有一个名为 str 的字符串变量 该 str 的值为 apple orange pineapple 每个单词由一个新的 VbLine 分隔 我想把它移到细胞上 A1 包含apple A2 包含orange并且A3包含pineappl
  • asp.net mvc Html.ActionLink() 保留我不想要的路由值

    我认为有以下 ActionLink 它创建以下 URLhttp mywebsite com Controller Action http mywebsite com Controller Action 假设我在末尾添加一个 ID 如下所示
  • 安全地发布网站构建后的最佳方法是什么?

    那么 根据您的经验 最好的方法是什么 是否有一种安全的方法可以在构建自动化工具中编写脚本 触发 编辑 我应该提到这是 windows net 我将部署到 iis6 对于我使用的一些项目卡皮斯特拉诺 http www capify org 推
  • iPhone SDK:自定义视频播放器控件

    在我的 iPhone 应用程序中 我设计了一个自定义视频播放器 目前它非常基本 只有一个播放暂停和停止按钮 但我希望用户能够像使用苹果原始媒体播放器一样擦除视频 我认为这是正确的词 例如 如果您明白我的意思 我希望能够使用 UISlider
  • 删除数据框中不常见的行

    假设我有一个非常简单的数据框 a lt rep 5 30 b lt rep 4 80 d lt rep 7 55 df lt data frame Column c a b d 最会是什么generic删除所有出现次数少于 60 次的行的方
  • 如何在 Qt 中的小部件下绘制阴影?

    我想知道如何在 Qt 中的小部件 不是主小部件 例如标签 下绘制阴影 我需要使用样式表还是需要对其进行编码 用 C 假设您有一个表单和一个标签 想要从中投射阴影 您可以使用QGraphics 阴影效果 http qt project org
  • 在 LINQ 2 SQL 中不先选择数据就进行更新?

    如何在不先在 LINQ 中选择数据的情况下更新记录 由于您必须首先执行 linq select 显然会调用成本高昂的 SQL SELECT 因此更改所需的属性 然后执行 SubmitChanges 我希望避免这种情况 只执行 SQL UPD
  • Hibernate 全局“动态插入”

    有没有办法设置dynamic insertHibernate 全局属性 因此它将是所有实体的默认值 在 NHibernate 中是 foreach var clazz in config ClassMappings clazz Dynami
  • 在 WSL2 上运行的 Jupyter 实验室网络错误

    我在 WSL2 Ubuntu 上运行 Jupyter Lab 并在 Win10 PC 上的 Firefox 中访问它 它们在同一台机器上运行 因此不应该涉及 网络 我正在运行它jupyter lab no browser 服务器在终端中启动
  • 传递函数作为参数?

    这是我的事件 正如您所看到的 我想发送一个以它作为参数的函数 onclick deleteItems image size function GetImageSize 删除函数在js文件中 在我的 js 文件中 我想调用 GetImageS
  • 各组最新值的总和

    对于我的每一行数据 我想计算最近的总和value对于每个group dt data table group c a b a a b a value c 10 5 20 15 15 10 desired c 10 15 25 20 30 25