【问题标题】:Cumulative difference In RR中的累积差异
【发布时间】:2022-10-02 16:47:13
【问题描述】:

R中cumsum()的反义词是什么

a = c(2, 5, 8)
cumsum = c(2, 7, 15)
cumdiff = c(2, 3, 1)

因为 5-2 = 3 和 8-7 = 1。

有没有可以在 R 中用于这个的包?

  • c(a[1],a[-1] - cumsum(a)[-length(a)])
  • @maydin 请张贴作为答案。
  • @zx8754 一开始我是这么想的,但和下面的答案差别不大。只有一个班轮。

标签: r vector difference cumulative-sum


【解决方案1】:

base R:

cumdiff <- function(x) x - head(c(0, cumsum(x)), -1)
#cumdiff <- function(x) x - c(0, cumsum(x))[-(length(x) + 1)]

dplyr,与lagdefault = 0

library(dplyr)
cumdiff <- function(x) x - lag(cumsum(x), default = 0)

结果:

a = c(2,5,8)
cumdiff(a)
#[1] 2 3 1

【讨论】:

    【解决方案2】:

    如果 cumdiff 你的意思是向量中的当前值减去先前值的累积和,你可以使用下面的:

    a = c(2,5,8)
    cumdiff <- function(x){
      out <- x - lag(cumsum(x))
      out[1] <- x[1]
      return(out)
    }
    cumdiff(a)
    [1] 2 3 1
    
    
    library(dplyr)
    tibble(a) %>% 
      mutate(cumsum = cumsum(a),
             cumdiff = cumdiff(a))
    #> # A tibble: 3 × 3
    #>       a cumsum cumdiff
    #>   <dbl>  <dbl>   <dbl>
    #> 1     2      2       2
    #> 2     5      7       3
    #> 3     8     15       1
    

    reprex package (v2.0.1) 于 2022 年 9 月 8 日创建

    【讨论】:

    • 那么如果不能将 cumdiff[1] 表示为 a 中的第一行?
    • 从技术上讲,您无法计算第一个的 cumdiff,但如果您仍想返回起始值,您可以编辑代码如下:cumdiff &lt;- function(x){ out &lt;- x - lag(cumsum(x)) out[1] &lt;- x[1] return(out) }cumdiff(a) tibble(a = c(2,5,8)) %&gt;% mutate(cumsum = cumsum(a), cumdiff = cumdiff(a)) 我已经编辑了我的答案,所以它返回第一个值你希望
    【解决方案3】:
    library(dplyr)
    data.frame(a)  %>% 
      mutate(
             cumdiff = a - lag(cumsum(a)),
             cumdiff = ifelse(is.na(cumdiff), a, cumdiff)
             )
      a cumdiff
    1 2       2
    2 5       3
    3 8       1
    

    【讨论】:

      猜你喜欢
      • 2016-03-16
      • 1970-01-01
      • 2020-08-27
      • 2022-07-24
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2021-04-07
      相关资源
      最近更新 更多