如何使用特定的列顺序计算累积总和?

如何解决如何使用特定的列顺序计算累积总和?

我有一个数据集,我想在其中计算 R 中的累积总和。我的数据名称示例 agfield

ID SUP 兰德
1 500 1
2 5681 4
3 6514 3
4 25 2
... ... ...

基本上,我想使用RAND列的顺序计算csum列中SUP列的累积总和。 预期结果:

ID SUP 兰德 csum
1 500 1 500
2 5681 4 12720
3 6514 3 7039
4 25 2 525
... ... ... ...

我在这里查看了有关此主题的其他几个问题/答案,但我可以得到一个遵循 RAND 列顺序的结果。 我尝试使用 agfield$csum<-ave(agfield$SUP,agfield$RAND,FUN=cumsum),但它只给我 SUP 编号,不计算累积总和。 我也尝试使用 group_by,但它做了同样的事情。您对执行此操作的有效方法有什么建议吗?

解决方法

我认为如果你重新排列你的行,它会成为一个很容易的问题

library(tidyverse)

df_example <- tibble::tribble(
  ~ID,~SUP,~RAND,1L,500L,2L,5681L,4L,3L,6514L,25L,1L
  )

df_example %>% 
  arrange(RAND,ID) %>% 
  mutate(csum = cumsum(SUP))
#> # A tibble: 4 x 4
#>      ID   SUP  RAND  csum
#>   <int> <int> <int> <int>
#> 1     1   500     1   500
#> 2     3    25     1   525
#> 3     3  6514     3  7039
#> 4     2  5681     4 12720

reprex package (v0.3.0) 于 2021 年 1 月 20 日创建

,

一种选择是创建一个临时的额外列来存储数据的初始顺序,然后计算累积总和。然后我们可以把它放回初始顺序并删除临时列。

library(dplyr)
agfield %>%
  mutate(INITORDER = row_number()) %>%
  arrange(RAND,INITORDER) %>%
  mutate(csum = cumsum(SUP)) %>%
  arrange(INITORDER) %>%
  dplyr::select(-INITORDER)
  ID  SUP RAND  csum
1  1  500    1   500
2  2 5681    4 12720
3  3 6514    3  7039
4  3   25    1   525

样本数据:

agfield <- structure(list(ID = c(1L,3L),SUP = c(500L,25L),RAND = c(1L,1L)),class = "data.frame",row.names = c(NA,-4L))
,

1) order 使用末尾注释中的数据并假设您想在不更改行顺序的情况下执行此操作,此基本解决方案定义了排序 {{1 }} 作为SUP,将其应用于o,取其中的SUP,然后通过应用逆序将其恢复为原始顺序,即cumsum。>

order(o)

给予:

o <- order(agfield$RAND)
transform(agfield,cum = cumsum(SUP[o])[order(o)])

这是一个演示,表明逆序确实是上面显示的表达式。

  ID  SUP RAND  csum
1  1  500    1   500
2  2 5681    4 12720
3  3 6514    3  7039
4  3   25    1   525

如果对数据框进行排序是可以接受的,那么我们可以这样做,它会稍微短一些。

set.seed(123)
x <- rnorm(1000)
o <- order(x)
identical(x,x[o][order(o)])
## [1] TRUE

2) sql SQL 具有特定的功能,允许以不同于输入的顺序获取累积和,因此我们可以执行以下操作。请注意,除非我们明确要求,否则 SQL 不保证表的顺序,因此我们在最后使用 o <- order(agfield$RAND) transform(agfield[o,],cum = cumsum(SUP)) 以确保返回原始顺序——如果返回的顺序不重要,则可以省略它。

order by rowid

给予:

library(sqldf)
sqldf("select ID,SUP,RAND,sum(SUP) over (order by RAND,rowid) csum 
  from agfield
  order by rowid")

注意

  ID  SUP RAND  csum
1  1  500    1   500
2  2 5681    4 12720
3  3 6514    3  7039
4  3   25    1   525
,

基本的 R 选项

transform(
  agfield,csum = cumsum(SUP[RAND])[RAND]
)

给予

  ID  SUP RAND  csum
1  1  500    1   500
2  2 5681    4 12720
3  3 6514    3  7039
4  3   25    2   525

数据

> dput(agfield)
structure(list(ID = c(1L,2L)),-4L))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res