【问题标题】:A CUMSUM in R with memory or window of two with dplyrR 中的 CUMSUM 与 dplyr 的内存或两个窗口
【发布时间】:2021-05-05 16:42:49
【问题描述】:

我正在尝试使用内存为 2 或两行的内存来聚合数据。

尝试 CUMSUM 和 Rolling 功能,但没有成功。

这是数据的摘录:

data <-  data.frame( a = c(198030,152881,226933,173185,146450))

       a
1 198030
2 152881
3 226933
4 173185
5 146450

我想了解以下内容:

       a      b
1 198030 198030
2 152881 350911
3 226934 577845
4 173185 751030
5 146450 897480

这里的b列,对于第一行,等于a列,对于其他值,它是a行+b列之前的值之和,以此类推。

如果它在 dplyr 或 tidyr 中更好,但这并不重要。

【问题讨论】:

  • Oscar,您的预期输出列 a 与您在前一个代码块中创建的不同(第 3 行)。 (我花了几分钟才弄清楚为什么我无法重现你的数字。)

标签: r dplyr tidyr cumsum


【解决方案1】:

我认为cumsum 可能是最好的方法(正如其他答案中所证明的那样)。但是您关于“a 行的总和 + b 列之前的值” 为我翻译成一行的b 值等于该行的a 值加上b 的先前值.虽然cumsum 确实更有效地解决了这个问题,但逻辑属于Reduce

data$b <- cumsum(data$a)
data$b2 <- Reduce(`+`, data$a, init=0, accumulate=TRUE)[-1]
data
#        a      b     b2
# 1 198030 198030 198030
# 2 152881 350911 350911
# 3 226933 577844 577844
# 4 173185 751029 751029
# 5 146450 897479 897479

因此,如果您真的只需要列b,并且您的所有操作都只是+,那么cumsum 最适合您。如果问题被简化/概括了一点,而您需要更复杂的东西,cumsum (etc) 无法解决,那么Reduce(.) 的前提可能适合您。

【讨论】:

  • @akrun,您的问题无需删除:您的问题是第一个推荐cumsum,并以OP 要求的dplyr 方法提供。
  • 没关系。我删除了,因为它可能会被标记为欺骗。根据目前新手接受的趋势,许多人甚至不会这样做。从成本/收益的角度来看,保留它是不值得的
  • 我绝对理解这种挫败感(接受 n00b 等),但将其作为欺骗关闭并不会从本质上降低分数,但删除您的问题会删除您的赞成票(并不是说您正在挨饿积分)。感谢您回来。
【解决方案2】:

cumsum 应该可以工作,但如果你需要做一些事情 以不同的方式积累

> tibble( a = c(198030,152881,226933,173185,146450)) %>%
+ mutate(b=accumulate(a,~..2+..1))
# A tibble: 5 x 2
       a      b
   <dbl>  <dbl>
1 198030 198030
2 152881 350911
3 226933 577844
4 173185 751029
5 146450 897479
> 

【讨论】:

    猜你喜欢
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多