通过 R 中的因子向量化 cumsum

2024-03-28

我正在尝试在一个非常大的数据帧(约 220 万行)中创建一个列,用于计算每个因子级别的 1 的累积和,并在达到新的因子级别时重置。下面是一些与我自己的类似的基本数据。

itemcode <- c('a1', 'a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a3', 'a4', 'a4', 'a5', 'a6', 'a6', 'a6', 'a6')
goodp <- c(0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1)
df <- data.frame(itemcode, goodp)

我希望输出变量 cum.goodp 看起来像这样:

cum.goodp <- c(0, 1, 2, 0, 1, 1, 2, 0, 0, 1, 1, 1, 2, 0, 1)

我知道有很多使用规范的拆分-应用-组合方法的方法,该方法在概念上是直观的,但我尝试使用以下方法:

k <- transform(df, cum.goodp = goodp*ave(goodp, c(0L, cumsum(diff(goodp != 0)), FUN = seq_along, by = itemcode)))

当我尝试运行这段代码时,速度非常非常慢。我知道转换是原因的一部分(“by”也没有帮助)。 itemcode 变量有超过 70K 个不同的值,因此它可能应该被矢量化。有没有办法使用 cumsum 对其进行矢量化?如果没有,任何帮助都将非常感激。非常感谢。


基本 R 方法是计算整个向量的 cumsum,并使用游程编码捕获子列表的几何形状。找出每个组的开始,并创建新组

start <- c(TRUE, itemcode[-1] != itemcode[-length(itemcode)]) | !goodp
f <- cumsum(start)

将这些总结为游程编码,并计算总和

r <- rle(f)
x <- cumsum(x)

然后使用几何得到每个嵌入和需要校正的偏移量

offset <- c(0, x[cumsum(r$lengths)])

并计算更新值

x - rep(offset[-length(offset)], r$lengths)

这是一个函数

cumsumByGroup <- function(x, f) {
    start <- c(TRUE, f[-1] != f[-length(f)]) | !x
    r <- rle(cumsum(start))
    x <- cumsum(x)
    offset <- c(0, x[cumsum(r$lengths)])
    x - rep(offset[-length(offset)], r$lengths)
}

这是应用于示例数据的结果

> cumsumByGroup(goodp, itemcode)
 [1] 0 1 2 0 1 1 2 0 0 1 1 1 2 0 1

它的性能

> n <- 1 + rpois(1000000, 1)
> goodp <- sample(c(0, 1), sum(n), TRUE)
> itemcode <- rep(seq_along(n), n)
> system.time(cumsumByGroup(goodp, itemcode))
   user  system elapsed 
   0.55    0.00    0.55 

dplyr 解决方案大约需要 70 秒。

@alexis_laz 解决方案既优雅又比我的快 2 倍

cumsumByGroup1 <- function(x, f) {
    start <- c(TRUE, f[-1] != f[-length(f)]) | !x
    cs = cumsum(x)
    cs - cummax((cs - x) * start)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 R 中的因子向量化 cumsum 的相关文章

  • 使用 Visual Studio 构建 R 包 (C API)

    我正在尝试使用 Visual Studio 构建一个简单的 R 包 这是我的代码 include
  • 通过非 sf 列内连接两个 sf 对象

    我尝试使用内连接或左连接连接两个 sf 数据帧 这些数据框内部都有几何列 我不断收到错误 check join x y 中的错误 y 应该是一个数据框 对于空间连接 请使用 st joinFALSE 下面的可重现示例 df1 lt data
  • Leaflet Map - 第二个多边形使第一层不可点击

    我正在制作美国社区调查数据地图 目前我有一个主要层 如下所示plotMerge incomePerCapita 它运作良好 有一个完全充实的弹出窗口 图像等等 当我添加第二层以提供县和地区边界时 区域边界变得不可单击 似乎被新层掩盖了 如果
  • R2WinBUGS - 使用模拟数据进行逻辑回归

    我只是想知道是否有人有一些使用 R2WinBUGS 包来运行逻辑回归的 R 代码 理想情况下使用模拟数据来生成 真相 和两个连续协变量 Thanks 基督教 PS 生成人工数据 一维情况 并通过 r2winbugs 运行 winbugs 的
  • 两组点之间的距离[重复]

    这个问题在这里已经有答案了 因此 在查看了 stackoverflow 上提出的各种问题后 我仍然无法理解 R 中的 dist 函数 甚至无法理解一般的距离矩阵 所以我有两个带有 xy 坐标的数据框 df1 lt data frame x
  • R 中的优化函数可以接受目标、梯度和粗麻布吗?

    我有一个想要优化的复杂目标函数 优化问题需要相当长的时间来优化 幸运的是 我确实有可用的函数的梯度和粗麻布 R 中是否有一个优化包可以接受所有这三个输入 optim 类不接受 Hessian 矩阵 我已经扫描了用于优化的 CRAN 任务页面
  • R:使用 RGDAL 和 RASTER 包时抛出错误

    给所有可能相关的人 这是源代码 GRA D1 lt raster files 1 Sets up an empty output raster GRA D1 lt writeStart GRA D1 filename GRA D1 tif
  • R 中多类分类的 ROC 曲线

    我有一个包含 6 个类别的数据集 我想绘制多类别分类的 ROC 曲线 Achim Zeileis 给出的第一个答案非常好 R中使用rpart包的ROC曲线 https stackoverflow com questions 30818188
  • 更改 ggplot 条形图填充颜色

    有了这个数据 df lt data frame value c 20 50 90 group c 1 2 3 我可以得到一个条形图 df gt ggplot aes x group y value fill value geom col c
  • 更改列的顺序

    我正在处理一个包含 gt 40 列的大型数据框 我希望能够移动列 而不必指定所有列名称 例如 a lt c 1 5 b lt c 4 3 2 1 1 Percent lt c 40 30 20 10 10 Labels lt c Cat D
  • 将阿拉伯文本分配给 R 变量

    R 无法正确显示阿拉伯文本 当我使用阿拉伯语时 我得到了非常奇怪的东西 这是一个屏幕截图 问题是我想创建一个带有阿拉伯文本的词云 我需要首先解决这个问题 R 版本 R 2 15 2 GUI 1 53 Leopard 版本 64 位 6335
  • ggmap 错误:GeomRasterAnn 是使用不兼容版本的 ggproto 构建的

    我正在使用 ggmap 并收到以下错误 Error GeomRasterAnn was built with an incompatible version of ggproto Please reinstall the package t
  • 从 data.frame 创建新列

    我有一个长格式的数据集 其中测量 时间 嵌套在 Networkpartners NP 中 而 Networkpartners NP 又嵌套在人员 ID 中 下面是它的示例 真实数据集有数千行 ID NP Time Outcome 1 11
  • 使用 ggplot_build 和 ggplot_gtable 后使用 ggsave 保存图形

    我正在通过更改 ggplot build 生成的数据来修改使用 ggplot 构建的图表 原因类似于包括 geom boxplot 中填充美学中使用的缺失因子水平的空间 https stackoverflow com questions 1
  • 使用facet时ggplot2控制每行的面板数量?

    Is it possible to control the number of panels per row in a ggplot I can only get an equal number of panels on each row
  • 在 R 中使用 gamlss::lms 选择百分位数曲线

    我正在使用 gamlss 包中的示例代码来绘制百分位数曲线 library gamlss data abdom lms y x data abdom n cyc 30 它正在绘制自己的一组百分位数曲线 如何选择只绘制第 10 50 和 90
  • 使用 Rcpp 得出斐波那契数列的意外结果

    我刚刚开始使用Rcpp很抱歉 如果我错过了一个简单的步骤或类似的东西 我已经尝试过这个 sourceCpp library Rcpp sourceCpp code include
  • 在knitr中打印漂亮的交叉表

    我想要的是使用 R Markdown 和 knit 从 RStudio 打印漂亮的交叉表 无论是在 pdf 文件中 还是在 html 文件中 我怀疑我错过了一些非常明显的东西 因为我不敢相信这是如此困难 我使用 xtabs 或 ftable
  • 在R中绘制3x3方形网格

    我得到了一个数字列表 n 9 想将它们画在一个 3 3 的正方形网格中 每个网格填充相应的数字 我如何在 R 中执行此操作而不安装额外的软件包 例如情节 非常感谢 这里有一个ggplot解决方案比我预期的要难一点 Setup the dat
  • 如何在ggplot2中使用希腊符号?

    我的类别需要用希腊字母命名 我在用ggplot2 并且它与数据配合得很好 不幸的是 我无法弄清楚如何将这些希腊符号放在 x 轴上 在刻度线处 并使它们出现在图例中 有什么办法可以做到吗 更新 我看了一下link https github c

随机推荐

  • 使用额外的命令从命令行启动 Android 活动 [重复]

    这个问题在这里已经有答案了 我创建了一个简单的活动 我想从命令行启动并从命令行传递一些值 但是 如果我尝试这样做 adb shell am start com example mike app SimpleActivity es Messa
  • android 画廊点击时没有滚动

    默认情况下 当单击图库项目时 图库会自动滚动到所单击的项目的中心 我怎样才能覆盖这种行为 我不希望图库在单击时滚动到中心 我希望它保持在原来的位置 我认为这是一个正确的解决方案 Override public boolean onSingl
  • 页面加载完成时打开 css 弹出窗口

    I have 纯CSS弹出窗口这个弹出窗口适用于单击按钮 但我需要在页面加载完成时弹出这个 div div class wrap a href modal one class btn btn big Modal a div div clas
  • 无法选择输入框中的文本

    我在表单上有以下用于浮动标签的 HTML CSS 抱歉 如果它有点混乱 box sizing border box html font 14px 1 4 Sans Serif form width 320px float left marg
  • C# 多线程:需要获取读锁吗?

    从多个线程读取变量之前是否需要获取变量的锁 简短的回答是 这取决于 长答案是 如果它不是共享值 即只有一个线程可以看到它 或使用它 则不需要任何同步 如果它是一个不可变的值 即您只设置一次 然后只读取一次 那么在没有同步的情况下这样做是安全
  • 如何排除嵌套复合聚合中的术语

    我在 elasticsearch 中的嵌套字段上使用复合聚合 但我想从结果中排除一些术语 此聚合正在运行 size 0 geo communication nested path geo aggs table composite size
  • 如何修复“android.os.NetworkOnMainThreadException”?

    我在运行 RssReader 的 Android 项目时遇到错误 Code URL url new URL urlToRssFeed SAXParserFactory factory SAXParserFactory newInstance
  • 如何让 jQuery Mobile 停止破坏 Ember.js 网站?

    我有一个用 Ember js 编写的网站 导航基于带有 符号的 url 我已经包含了 jQuery Mobile 我也有 jQuery 标准 jQuery 还可以 但是当我包含 jQuery Mobile 时 奇怪的事情发生了 符号从 UR
  • qtcreator - 未定义符号:sqlite3_column_table_name16

    我刚刚升级到 xubuntu 18 10 qt 不再为我工作 我已经删除并重新安装它 但没有帮助 我在终端上收到以下错误消息 显然某些 sqlite 依赖关系不正确 qtcreator qtcreator symbol lookup err
  • ASP.net MasterPage.master 不存在

    我在 IIS 服务器上发布我的网站时遇到问题 我无法直接访问它 因此我必须依靠其他人在 IIS 上配置我的网站 但是 当我上传我的网站时 出现此错误 Line 1 Line 2
  • Maven 程序集创建带有依赖项和类路径的 jar

    我有一个 Maven 项目 有很多依赖项 我想使用程序集插件将所有依赖项打包到一个 jar 中 但我不会将所有依赖项 jar 解压得一团糟 我希望它们全部进入 lib 文件夹 但我不知道如何添加类路径 我的pom
  • Orchard CMS - 配置基本 URL

    我使用 localhost frankgiotto 的基本 URL 在我的开发计算机上安装了最新版本的 Orchard 然后我将网站移至 www frankgiotto com 并在设置中更新了我的基本 URL 网站运行完美 我喜欢它的一切
  • 了解 intel 汇编中的 %rip 寄存器

    关于以下小代码 在另一篇关于结构大小和正确对齐数据的可能性的文章中对此进行了说明 struct char Data1 short Data2 int Data3 char Data4 x unsigned fun void x Data1
  • 想要计算列中满足条件的值的数量

    我正在尝试计算列中满足特定条件 例如 大于 0 75 的值的数量 我的列由 2000 多个小数组成 这是我尝试过的 a len fs c np zeros a for i in fs 0 a if i gt 0 75 print 1 eli
  • Django REST Framework Swagger - 身份验证错误

    我按照说明进行操作在文档中 http django rest swagger readthedocs io en latest 所以这是我的观点 from rest framework decorators import api view
  • 在 Android 中获取 WiFi 信号强度

    我可以使用以下代码获取以 dBm 为单位的 WiFi 信号电平 for ScanResult result wifiScanResultList int signalLevel result level 它给出负值 当我们看到默认的系统 W
  • Android 中的微调器出现错误

    我正在使用新样式的 Spinner Base Widget AppCompat Spinner Underlined 当我选择选项时 我可以看到下划线 并且该线以强调色显示 问题是我找不到一种方法来显示带有红色下划线的错误 例如谷歌对其所有
  • 在python中导入外部“.txt”文件

    我正在尝试导入包含大约 10 个单词的列表的文本 import words txt 那不行 无论如何 我可以在不显示此内容的情况下导入文件吗 Traceback most recent call last File D python p1
  • 在 prestashop 管理的编辑产品页面添加一个字段

    我在 prestashop 数据库的产品表中添加了一个字段 mystock 现在我想在编辑产品页面中显示 编辑此字段 产品更新时也会更新 这个适用于我的 prestashop 1 5 4 将文件 Product php 添加到 overri
  • 通过 R 中的因子向量化 cumsum

    我正在尝试在一个非常大的数据帧 约 220 万行 中创建一个列 用于计算每个因子级别的 1 的累积和 并在达到新的因子级别时重置 下面是一些与我自己的类似的基本数据 itemcode lt c a1 a1 a1 a1 a1 a2 a2 a3