查找数据框中前 n 行的总和

2024-07-04

我想找到前面的总和n数据框中的行。例如:

id = 1:10
vals = c(4,7,2,9,7,0,4,6,1,8)
test = data.frame(id,vals)

So, for n=3,我想将下一列计算为:

test$sum = c(NA, NA, 13,18,18,16,11,10,11,15)

我最接近的是使用以下命令创建一个新列:

test$valprevious = c(NA, head(test$vals,-1)

然后使用循环重复此操作n次,那么sum穿过柱子。我确信这不是最有效的方法,是否有任何函数可以访问n前几行?或者另一种方法可以做到这一点?


您可以使用rollsumr函数从zoo为此的包:

library(zoo)
test$sums <- rollsumr(test$vals, k = 3, fill = NA)

这使:

> test
   id vals sums
1   1    4   NA
2   2    7   NA
3   3    2   13
4   4    9   18
5   5    7   18
6   6    0   16
7   7    4   11
8   8    6   10
9   9    1   11
10 10    8   15

这与使用相同rollsum函数与align = 'right'范围:

rollsum(test$vals, k = 3, fill = NA, align = 'right')

作为替代方案,您可以使用Reduce with shift来自数据表 /questions/tagged/data.table包裹:

library(data.table)
setDT(test)[, sums := Reduce(`+`, shift(vals, 0:2))]

这给出了相同的结果:

> test
    id vals sums
 1:  1    4   NA
 2:  2    7   NA
 3:  3    2   13
 4:  4    9   18
 5:  5    7   18
 6:  6    0   16
 7:  7    4   11
 8:  8    6   10
 9:  9    1   11
10: 10    8   15

最近新增了快速滚动功能数据表 /questions/tagged/data.table。因此,另一种选择是:

setDT(test)[, sums := frollsum(vals, 3)]

@alexis_laz 在评论中提出的一个很好的基本 R 替代方案:

n <- 3
cs <- cumsum(test$vals)
test$sums <- c(rep_len(NA, n - 1), tail(cs, -(n - 1)) - c(0, head(cs, -n)))

@Khashaa 在评论中提出的另外两个选项:

# with base R
n <- 3
test$sums <- c(rep_len(NA, n - 1), rowSums(embed(test$vals, n)))

# with RcppRoll
library(RcppRoll)
test$sums <- roll_sumr(test$vals, 3)

基准:

As @alexis_laz 在评论中指出 https://stackoverflow.com/questions/37773356/find-sum-of-previous-n-rows-in-dataframe/37773562#comment63017758_37773562,某些解决方案可能会在重新计算总和和重新创建时产生开销length-向量。这可能会导致计算速度的差异。由于在如此小的数据集上进行基准测试并没有多大意义,因此我将在模仿示例数据集的大型数据集上对不同的解决方案进行基准测试:

# window size
n <- 3

# creating functions of the different solutions:
alexis_laz <- function(test) {cs <- cumsum(test$vals); test$sums <- c(rep_len(NA, n - 1), tail(cs, -(n - 1)) - c(0, head(cs, -n)))}
khashaa <- function(test) {test$sums <- c(rep_len(NA, n - 1), rowSums(embed(test$vals, n)))}
rcpp_roll <- function(test) test$sums <- roll_sumr(test$vals, n)
zoo_roll <- function(test) test$sums <- rollsumr(test$vals, k=n, fill=NA)
dt_reduce <- function(test) setDT(test)[, sums := Reduce(`+`, shift(vals, 0:(n-1)))]
dt_froll <- function(test) setDT(test)[, sums := frollsum(vals, n)]

# load the 'bench' package
library(bench)

# create a big test dataset
test <- data.frame(id=rep(1:10,1e7), vals=sample(c(4,7,2,9,7,0,4,6,1,8),1e7,TRUE))

# run the benchmark
big_bm <- mark(alexis_laz(test),
               khashaa(test),
               rcpp_roll(test), 
               zoo_roll(test), 
               dt_reduce(test), 
               dt_froll(test),
               iterations = 1,
               check = FALSE)

# extract some core measures and sort them
big_bm %>% select(expression, median, mem_alloc) %>% arrange(median)

这使:

  expression         median mem_alloc
  <bch:expr>       <bch:tm> <bch:byt>
1 dt_froll(test)   776.35ms    1.49GB
2 rcpp_roll(test)     1.23s  762.94MB
3 dt_reduce(test)     2.12s    4.47GB
4 alexis_laz(test)    3.68s    4.47GB
5 khashaa(test)       8.35s    5.21GB
6 zoo_roll(test)     33.32s   22.63GB

正如你所看到的,新的frollsum- 函数来自数据表 /questions/tagged/data.table-package 在速度方面显然是赢家。当考虑内存分配时,roll_sumr from rcpproll /questions/tagged/rcpproll需要最少的内存。

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

查找数据框中前 n 行的总和 的相关文章

  • 如何在 R 中将 mutate_at() 与两组变量一起使用

    使用 dplyr 我想将一列除以另一列 其中两列具有相似的模式 我有以下数据框 My data data frame var a 101 110 var b 201 210 number a 1 10 number b 21 30 我想创建
  • r - 按每天变化的日期过滤行

    该数据集为 1 列 包含数千行 其中包含日期 2021 09 23T06 38 53 458Z 使用以下代码 我可以对昨天的行进行子集化 rows from yesterday lt df df timestamp like 2021 09
  • 旋转和调整符号ggplot

    我正在尝试在 ggplot geom point 中绘制一个图 并且我能够绘制它 但我想根据某些变量来操纵特定符号的外观 我想按 data frame 定义的角度旋转符号 pch 22 Pch 22 看起来像一个矩形 另外 我想根据数据框中
  • 用小平面绘制 ggplot2 中分布的分位数

    我目前正在 ggplot 中绘制多个回归模型的一阶差分的多个不同分布 为了便于解释差异 我想标记每个分布的 2 5 和 97 5 百分位 由于我将制作相当多的绘图 并且由于数据按二维 模型和类型 分组 因此我想在 ggplot 环境中定义并
  • Tidyr 的 Gather() 与 NA

    我在用tidyr and lubridate将宽表转换为长表 以下效果很好 gt df lt data frame hh id 1 2 bday 01 ymd 20150309 bday 02 ymd 19850911 bday 03 ym
  • 条形图中的颜色

    我正在尝试使用 R 中的plotly 生成条形图 条形图应按值排序 并且有两类条形图 我想对它们进行不同的着色 但是 当我添加颜色时 条形图被分成两组 并在组内排序 关于如何将它们保留在一组中的任何提示 这是我的代码 plotting df
  • 如何将列的标记值解析为 Pandas Dataframe(缺少某些列值)?

    以下是我的未标记数据集的两行 这是一个小子集 random1 147 sub1 95 34 dewdfa3 15000 1238 SBAASBAQSBARSBATSBAUSBAXBELAAX AAA COL UVTWUVWDUWDUWDWW
  • 光栅到矢量:terra 包中的 WriteVector 导致致命错误

    我最近几天在 RStudio 上尝试过以下示例代码 library terra binar lt rast C Users BIC Desktop 21 binarisation SWIR tif poly rast lt as polyg
  • ggplot:aes 与 aes_string,或如何以编程方式指定列名称?

    假设我们有以下数据框 data lt data frame time 1 10 y1 runif 10 y2 runif 10 y3 runif 10 我们想要创建一个像这样的情节 p lt ggplot data aes x time p
  • 在R中绘制多个不同尺寸和坐标的3D盒子

    最近我偶然发现了 R 中的 rgl Package 它可以用来创建交互式 3D 绘图 现在我想在一个 3d 图中可视化一组盒子 Box B 具有笛卡尔坐标 B coord x y z 对应于左下后角 尺寸 B dim x1 y1 z1 显然
  • 按组在数据帧上运行自定义函数

    用于循环数据框中的组的自定义函数 这是一些示例数据 set seed 42 tm lt as numeric c 1 2 3 3 2 1 2 3 1 1 d lt as numeric sample 0 2 size 10 replace
  • R:按比例缩放 ggplot2、点阵或基本 R 图的函数

    在 R 中 我总是觉得很烦人的是 基本 R lattice 和 ggplot2 绘图都使用文本和绘图符号大小的绝对点大小 这意味着 如果您增加绘图窗口的大小以获取填充页面的图表 windows width 5 height 5 qplot
  • gc() 和 rm() 有什么区别

    我定期使用调用来清理 R 中的内存rm list ls 我需要调用垃圾收集器吗gc 在那之后 这2个函数有什么区别 做gc call rm 对于某些变量 首先 需要注意的是 两者有很大不同gc不删除any您仍在使用的变量 它只会为您不再有权
  • 创建半甜甜圈或议会席位图表

    我想在 ggplot2 中创建一个显示议会席位大小的图表 如下图所示 我的主要问题本质上是如何将圆环图转换为半圆环图 半圆弧 以上面的图片为例 我不知道从这里到哪里 df lt data frame Party c GUE NGL S D
  • 从 R 中的 CSV 文件读取“...”中定义的函数输入值

    假设我有一个 R 函数 例如foo以下 该函数有 4 个固定参数 以及定义在中的任意数量的任意参数 所有输入值foo参数存储在THIS https github com izeh i blob master j csvCSV 文件 在下面的
  • 停止 lapply 从打印到控制台

    当我使用lapply并打印到控制台 它打印出不需要的内容 i NULL虽然我希望将预期的消息打印到控制台 我试过了suppressWarnings and suppressMessages但这些并不能消除不受欢迎的罪犯 我搜索了lapply
  • R 中二进制向量中 1 和 0 分隔符的块的累积计数

    我有一个带有二进制向量的数据框 我想对其进行累积计数 不过 我想计算 1 组 而不是每个单独的 1 并创建此计数的新向量 同时保留 0 分隔值 IE df1 lt data frame c 0 1 1 1 1 0 0 0 1 1 1 1 1
  • 启动 R 会话时安装软件包

    我对 R 编程相当陌生 我正在尝试自定义我的 R 设置 以便当 R 会话启动时 会在开始时安装一些软件包 我知道我可以在 Rprofile site 文件中编写一个 First 函数 但是 在 First 函数中添加我的安装包代码后 该包并
  • R as.POSIXct() 删除小时、分钟和秒

    我正在尝试用 R 来分析一些测量数据 我有一个 csv 文件 其中包含超过 200 万条测量线 这是一个例子 2014 10 22 21 07 03 00 00 7432442 0 2014 10 22 21 07 21 00 00 743
  • 查找 R 中已知中心点的半径范围内的纬度/经度

    我有一个具有已知纬度和经度的已知点 中心 并且我在 df 中有一些坐标 以纬度 经度为单位 我想查看哪些坐标在距中心点 5 公里或更小的半径内 Centre mylon lt c 2 106472 mylat lt c 57 14455 坐

随机推荐

  • Scala:使用具体类型实现 Map

    我在 Scala 类型系统中遇到了某种怪癖 这让我有点困惑 我正在尝试创建一个扩展 Map String String 的类 但我不太清楚如何以编译器接受的方式实现 方法 这是我现在的代码 class ParamMap val pairs
  • SerializeObject 抛出 System.OutOfMemoryException

    我对 JsonConvert SerializeObject 有一个严重的问题我需要序列化超过500 000条字典记录才能使序列化抛出以下错误 System OutOfMemoryException 我尝试在 foreach 中单独序列化每
  • GWT 无法从 Hibernate 序列化我的对象

    这是我收到的错误 我到处寻找答案 但我无法弄清楚为什么其他人没有遇到同样的问题 当我从 Hibernate 检索 Proposal 对象时 会发生错误 该对象在作者和顾问这两个属性上具有 User Info 多对一约束 如果需要 我可以提供
  • 以编程方式将项目添加到相对布局

    我一直在到处寻找这个问题的答案 我是 Android 新手 尝试通过 java 而不是 xml 以编程方式将项目添加到相对布局 我创建了一个测试类来尝试一下 但项目不断堆叠而不是正确格式化 我现在只想将一个 TextView 放在另一个下面
  • OpenCL 中的重叠传输和设备计算

    我是 OpenCL 的初学者 我很难理解某些东西 我想改进主机和设备之间的图像传输 我制定了一个计划来更好地了解我 顶部 我现在拥有的 下图 我想要的 HtD 主机到设备 和DtH 设备到主机 是内存传输 K1 和 K2 是内核 我考虑过使
  • 使用 v8::Locker 的正确方法是什么?为什么必须使用它?

    我正在尝试使用 NDK 将 v8 嵌入到 Android 应用程序中 我有一个看起来像这样的 JNI 模块 未显示 JNI 映射代码 include
  • 我可以显示托管在 bitbucket 上的 Ipython 笔记本吗?

    我有一个非常简单的笔记本 托管在 github 和 bitbucket 上 这github 网址 https github com thomas haslwanter statsintro blob master ipynb demo ip
  • 具有 EditText 材质设计的工具栏

    我正在尝试制作带有 EditText 的工具栏 如下所示 现在我可以做一些类似的事情 但只能使用静态标题 有什么想法可以开始吗 我已经这样做了 如下所示 有Toolbar as AppBar aka ActionBar 位于顶部 其下方的第
  • Numpy,沿数组维度应用函数列表

    我有一个类型的函数列表 func list lambda x function1 input lambda x function2 input lambda x function3 input lambda x x 和形状为 4 200 2
  • 在 MacOS X 上安装 Node.js、nvm 和 npm 的推荐方法是什么?

    我正在尝试使用Homebrew https brew sh越多越好 推荐的安装方式是什么Node js https nodejs org en nvm https github com nvm sh nvm and npm https ww
  • 如何使用 Linq 对通用集合进行分页?

    我有一个 System Generic Collections List Of MyCustomClass 类型对象 给定整数变量 pagesize 和 pagenumber 如何仅查询 MyCustomClass 对象的任何单个页面 如果
  • 如何将 char 指针转换为 int 指针

    我想投射一个指针pc它将 char 指向一个点pi它指向 int char pc int pi pi int pc compiler complaint about old style cast pi static cast
  • KSQL 是否支持 Kafka 流处理保证?

    我想知道KSQL是否支持https docs confluence io current streams concepts html processing guarantees https docs confluent io current
  • 为唯一字段显示 Django 错误消息

    我想更改当重复条目尝试保存时的默认错误消息 而它们应该是唯一的 即unique True 很像这样 email models EmailField unique True error messages unique This email h
  • 确定字符串是否为有效的浮点值

    有没有一种方法可以简单地检查字符串值是否是有效的浮点值 如果字符串不是数值 则对字符串调用 to f 会将其转换为 0 0 当传递一个无效的浮点字符串时 使用 Float 会引发异常 该字符串更接近我想要的 但我不想处理捕获异常 我真正想要
  • 如何创建看起来与 ContextMenu 完全相同的对话框?

    有时使用标准活动方法来创建上下文菜单并不方便 因为一个活动中可能有很多地方 但在不同的类中 需要显示上下文菜单 但从任何地方创建对话框都很容易 如何创建看起来与 ContextMenu 完全相同的对话框 我在哪里可以找到标准上下文菜单的布局
  • 如何检测安装的Chrome版本?

    我正在开发一个 Chrome 扩展程序 我想知道是否有一种方法可以检测用户正在使用哪个版本的 Chrome 获取 Chrome 的主要版本作为整数 function getChromeVersion var raw navigator us
  • 剥离功能未按预期工作

    def sstrip a b raw input enter the string to be stripped off i a strip b print i k raw input enter the string sstrip k o
  • 为什么 Python 中的元组不可变? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 python 字符串和元组是不可变的 https stackoverflow com questions 1538663 why are python strings and tuples a
  • 查找数据框中前 n 行的总和

    我想找到前面的总和n数据框中的行 例如 id 1 10 vals c 4 7 2 9 7 0 4 6 1 8 test data frame id vals So for n 3 我想将下一列计算为 test sum c NA NA 13