【问题标题】:Functional way to reverse cumulative sum?反转累积和的功能方法?
【发布时间】:2014-01-28 22:29:55
【问题描述】:

如果我有一个累积和的向量,例如

> vec <- cumsum(1:10)
[1]  1  3  6 10 15 21 28 36 45 55

有没有一种功能性的方法可以将vec 转换为c(1:10) 的原始向量?

现在,我正在使用一个 for 循环:

> result <- vec[1]
> for (i in 2:length(vec)) result <- append(result, vec[i]-vec[i-1])
> result
[1]  1  2  3  4  5  6  7  8  9 10

但这对我来说似乎不太像 R... 有什么想法吗?

【问题讨论】:

  • 我猜你的循环可以像c(vec[1], vec[-1] - vec[-length(vec)])一样被“矢量化”

标签: r


【解决方案1】:

只需使用diff 获取连续差异:

> c(vec[1],diff(vec))
 [1]  1  2  3  4  5  6  7  8  9 10

【讨论】:

  • 手指比我快!
  • @Justin 太快了,我还没开始就写完这条评论!
  • 此解决方案对于mutate(new = diff(old)) 可能存在问题,因为diff() 的长度为n-1。
  • @AndrewMcCartney 您是否注意到我的回答包括在前面附加一个值以使长度匹配?
【解决方案2】:

如果其他人希望在整个 dataframe 中反转 cumsum,我使用了以下内容:

我的数据框是Factor.df,第一列是一系列character - 因此选择第二列。希望对你有帮助

Factor.df[,2:ncol(Factor.df)] <- Factor.df[,2:ncol(Factor.df)] %>% dplyr::mutate_each(dplyr::funs((.) - dplyr::lag(.)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多