使用 data.table R 以滚动方式提取累积唯一值(重置和恢复)

2023-12-14

给定一个 data.table,我想提取累积的唯一元素,直到达到三个唯一值,然后重置并恢复:

y <- data.table(a=c(1, 2, 2, 3, 3, 4, 3, 2, 2, 5, 6, 7, 9, 8))

所需的输出 unique_acc_roll_3 为:

a   unique_acc_roll_3
1                   1
2                 1 2
2                 1 2
3               1 2 3
3               1 2 3  
4                   4  #4 is the forth element, so it resets and start again
3                 3 4
2               2 3 4
2               2 3 4
5                   5  #5 is the forth element, so it resets and start again 
6                 5 6
7               5 6 7
9                   9  #9 is the forth element, so it resets and start again
8                 8 9

因为它递归地引用回来,所以我真的陷入了困境......真实数据很大,所以 data.table 解决方案会很棒。


我想不出任何方法来避免for本质上是循环,除了将其隐藏在Reduce称呼。我的逻辑是保留union- 计算每行的每个新值,直到集合增长到length == n,此时新值将用作循环下一次迭代的起点。

unionlim <- function(x, y, n=4) {
  u <- union(x,y)
  if(length(u) == n) y else u
}

y[, out := sapply(Reduce(unionlim, a, accumulate=TRUE), paste, collapse=" ")]

#    a   out
# 1: 1     1
# 2: 2   1 2
# 3: 2   1 2
# 4: 3 1 2 3
# 5: 3 1 2 3
# 6: 4     4
# 7: 3   4 3
# 8: 2 4 3 2
# 9: 2 4 3 2
#10: 5     5
#11: 6   5 6
#12: 7 5 6 7
#13: 9     9
#14: 8   9 8

这远不是地球上最快的代码,但快速测试表明,在我的像样的机器上,它可以在大约 15 秒内处理大约 100 万个案例。

bigy <- y[rep(1:nrow(y), 75e3)]
system.time({
  bigy[, out := sapply(Reduce(unionlim, a, accumulate=TRUE), paste, collapse=" ")]
})
#   user  system elapsed 
#  14.27    0.09   15.06 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 data.table R 以滚动方式提取累积唯一值(重置和恢复) 的相关文章

随机推荐

  • python 中 Appengine 的通配符搜索

    我刚刚开始在 Google App Engine 上使用 Python 构建联系人数据库 实现通配符搜索的最佳方法是什么 例如 我可以执行 query name newman 吗 不幸的是 Google 应用引擎无法进行部分文本匹配 来自文
  • 使用 Java 和 Samba JCIFS 访问文件

    我有一个关于使用 Samba JCIFS 访问文件的问题 所以我想访问一个服务器 我们将其称为server unv edu 工作组是WKGRP 此服务器中有一个共享 server unv edu pcb 我尝试访问服务器的方式是 publi
  • 防止变量名被 read.csv/read.table 破坏?

    我的数据集testdata有 2 个名为PWGTP and AGEP 数据位于 csv file 当我做 gt head testdata 变量显示为 PWGTP AGEP 23 55 26 56 24 45 22 51 25 54 23
  • 通过文件输入选择多个文件时删除单个文件

    当允许用户选择多个文件时 是否可以从要上传的文件列表中删除单个文件 例如 我有一个看起来有点像这样的输入
  • Android:使用 xslt 转换 xml

    我想使用 xsl 文件转换一些 xml 并以某种方式输出结果 我使用的是 Android Api Level 8 我当前的活动如下所示 但变压器保持为空 LogCat 抛出一个System err with org apache harmo
  • 如何消除const_iterator的常量性?

    作为这个问题的延伸Are const iterators faster 我还有一个问题const iterators 如何消除 a 的常量性const iterator 虽然迭代器是指针的广义形式 但仍然const iterator and
  • 获取 Dart 中的当前日期

    如何在 Dart 中获取独立于系统日期和时间的当前日期 我努力了DateTime now但它给出的是系统日期而不是实际日期 以防系统日期被更改 如果您不相信系统会给出正确的时间 则需要向其他地方询问以获取时间 这可以通过多种方式完成 具体取
  • ABP 中实体的 DTO 映射异常

    当我尝试插入实体时 出现有关 映射 的错误 插入物是由CreateCrudAppService 的方法 我的实体继承自FullAuditedEntity但相关的 DTO 仅指定了几个属性 我该如何处理这种情况 Unmapped member
  • 删除所有的 .字符串中除最后一个之外的(点)

    我需要删除字符串中除最后一个点之外的所有点 例如 如果字符串是 1 2 3 4 5 则结果需要是 1234 5 这是在 powershell 中 我做不到 先感谢您 正则表达式替换 所有点后面没有点 1 2 3 4 replace
  • 在 C++、OpenGL 中使用 De Casteljau 算法绘制贝塞尔曲线

    我正在尝试找到使用 decasteljau 算法生成贝塞尔曲线的方法 以完成我的一项作业 我能够使用正常方法生成贝塞尔曲线 但无法开始使用上述算法生成 如果有人可以建议我正确的方向或分享您拥有的任何代码 这将会有很大的帮助 我不只是按原样询
  • 萤火虫错误:找不到元素

    1客户端 通过 AJAX fn 向服务器发送请求 2服务器 响应形式为text xml并且只能正常运行 1 到 2 次 response setContentType text xml 3但仅在 1 2 请求之后 我在浏览器中收到错误 fi
  • 从 Google 云端硬盘下载图像

    我正在尝试使用 python api 从 Google Drive 下载一些图像文件 我使用的代码首先获取文件资源对象 找到 downloadUrl 并使用它来下载文件 问题是gif和png文件似乎没有下载网址 service self u
  • 连接到 Paypal 时出现 OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 读取服务器证书 B:证书验证失败)

    我知道有很多关于此错误的讨论 但遗憾的是我无法在那里找到任何可行的解决方案 我正在开发一个电子商务网站分享部落 我正在尝试将 Paypal 实施为支付网关 所以我正在使用活跃商户 在开发机器上一切正常 但是当我将 Rails 应用程序部署到
  • 在 Android 所有活动上设置标签栏底部

    我开发了一款Android应用程序 在这里 我必须在所有 Android 活动上设置选项卡栏底部 我该怎么做 请给我解决方案 我总共有 10 个活动 这意味着选项卡栏显示在所有 10 个活动的按钮上 我在 android 中该怎么做 请帮助
  • BroadcastReceiver获取ServiceState信息

    有谁知道在android中获取电话服务状态 IN SERVICE OUT OF SERVICE EMERGENCY ONLY POWER OFF 的方法 我希望有一个广播接收器来识别这些变化 但我找不到任何东西 我知道有一个侦听器 但我不确
  • 如何在 R 中计算这个求和?

    如果我们有一个数据集 其中 x ij 的大小为 4 x 3 矩阵 i 1 2 3 4 且 j 1 2 3 y i 是一个向量 z ij 也是一个 4 x 3 矩阵 a1 c 1 0 1 2 a2 c 2 2 1 2 a3 c 1 3 2 3
  • 错误 无法安装应用程序。确保您已设置 Android 开发环境

    我创建了react native项目 然后在终端打开该文件夹 运行 npm start 然后 react native run android 后 我能够在虚拟设备上运行它 但是 当我从 vscode 终端执行此操作时 出现以下错误 信息
  • 将 JTextfield 放在 JPanel 上?

    为什么文本字段没有出现在框架内的面板上 我的意思是是否需要一些额外的操作来制作面板的组件 可见的 我希望有人能帮助我 public class example1 public static void main String args JFr
  • 外部函数:在 C 脚本中引用头文件来编译 dll

    使用 Dymola 2017 情况 A 调用外部 c 脚本 我已经成功实现了没有 include 语句的简单外部 c 函数 模型功能 function chirp input Modelica SIunits AngularVelocity
  • 使用 data.table R 以滚动方式提取累积唯一值(重置和恢复)

    给定一个 data table 我想提取累积的唯一元素 直到达到三个唯一值 然后重置并恢复 y lt data table a c 1 2 2 3 3 4 3 2 2 5 6 7 9 8 所需的输出 unique acc roll 3 为