当前位置: 首页 > 知识库问答 >
问题:

从头到尾计算总和

弘伟彦
2023-03-14

我试图计算每组从最后一行到第一行的cumsum

样本数据:

t1 <- data.frame(var = "a", val = c(0,0,0,0,1,0,0,0,0,1,0,0,0,0,0))
t2 <- data.frame(var = "b", val = c(0,0,0,0,1,0,0,1,0,0,0,0,0,0,0))
ts <- rbind(t1, t2)

所需格式(按var分组):

ts <- data.frame(var = c("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
                           "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b"), 
                 val = c(2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,2,2,2,2,2,1,1,1,0,0,0,0,0,0,0))

共有2个答案

钱黎明
2023-03-14

没有显式反转向量的选项:

ave(ts$val, ts$var, FUN = function(x) Reduce(sum, x, right = TRUE, accumulate = TRUE))

 [1] 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 1 1 1 0 0 0 0 0 0 0

或者与dplyr相同的方法

ts %>%
 group_by(var) %>%
 mutate(val = Reduce(sum, val, right = TRUE, accumulate = TRUE))
薛英卫
2023-03-14

使我的评论得到回答;使用:

ts$val2 <- ave(ts$val, ts$var, FUN = function(x) rev(cumsum(rev(x))))

给予:

> ts
   var val val2
1    a   0    2
2    a   0    2
3    a   0    2
4    a   0    2
5    a   1    2
6    a   0    1
7    a   0    1
8    a   0    1
9    a   0    1
10   a   1    1
11   a   0    0
12   a   0    0
13   a   0    0
14   a   0    0
15   a   0    0
16   b   0    2
17   b   0    2
18   b   0    2
19   b   0    2
20   b   1    2
21   b   0    1
22   b   0    1
23   b   1    1
24   b   0    0
25   b   0    0
26   b   0    0
27   b   0    0
28   b   0    0
29   b   0    0
30   b   0    0

或者使用dplyrdata.table

library(dplyr)
ts %>% 
  group_by(var) %>%
  mutate(val2 = rev(cumsum(rev(val))))

library(data.table)
setDT(ts)[, val2 := rev(cumsum(rev(val))), by = var]
 类似资料:
  • 问题内容: 假设我有带有列的表 TabA : col1-主键(但不包括身份) col2-外键 col3-具有唯一约束 col4-具有检查约束 col5-具有NOT NULL约束 此外, TabA 具有2个触发器: INSTEAD OF INSERT-这个取消插入到 TabA中 (当然),但是在它自己的代码中,将新行插入 TabA中 。保证此新行中所有列的值正确 插入后-此仅打印字符串 现在,我准备

  • 题目链接 牛客网 题目描述 从尾到头反过来打印出每个结点的值。 解题思路 1. 使用递归 要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。 // java public ArrayList printListFro

  • 一、题目 输入个链表的头结点,从尾到头反过来打印出每个结点的值。 二、解题思路 使用栈的方式进行。 将链表从头到尾压入栈内,出栈的过程就对应着从尾到头。 三、解题代码 public class Test { /** * 结点对象 */ public static class ListNode { int val; // 结点的值

  • 从头到尾彻底理解傅里叶变换算法、下 推荐阅读:The Scientist and Engineer’s Guide to Digital Signal Processing,By Steven W. Smith, Ph.D。此书地址:http://www.dspguide.com/pdfbook.htm。 前期回顾,在上一篇里,我们讲了傅立叶变换的由来、和实数形式离散傅立叶变换(Real DFT)

  • 从头到尾彻底理解傅里叶变换算法、上 I、本文中阐述离散傅里叶变换方法,是根据此书:The Scientist and Engineer’s Guide to Digital Signal Processing,By Steven W. Smith, Ph.D.而翻译而成的,此书地址:http://www.dspguide.com/pdfbook.htm。 II、同时,有相当一部分内容编辑整理自dz

  • 问题内容: 我正在尝试计算阶乘产生的数字的尾随零(这意味着数字变得很大)。以下代码采用一个数字,计算该数字的阶乘,并计算尾随零。但是,当数字大约为25!时,numZeros将不起作用。 我并不担心这段代码的效率,并且我知道有多种方法可以使这段代码的效率更好。我要弄清楚的是为什么计数大于25的数字结尾的零!不管用。 有任何想法吗? 问题答案: 您的任务不是计算阶乘,而是计算零的数量。一个好的解决方案