r数据帧中的组的cumsum,不包括第一个值

时间:2018-04-16 11:07:58

标签: r cumulative-sum cumsum

我有一个数据框,其中的组由一个因子值定义。我正在尝试添加一个基于每个组的累积总和的列。

bbb<-c(2,4,6,3,5,7)
factor<-gl(2,3)
df<-data.frame(bbb,factor)

我找到了ave()函数并成功使用了它,如下所示:

df$cumbbb<-ave(df$bbb,df$factor,FUN=cumsum)

我现在需要改变一个相对较小的东西。我想忽略累积和中每个组的第一个值。

## At the moment the output is
[1]  2  6 12  3  8 15
## The output I need is
[1] 0 4 10  0 5 12

到目前为止,我的想法是:

在ave()中找到一些额外的功能,例如,在[2:length]中滑动到适当的位置,到目前为止我还没有管理过。

按照我的方式执行ave()函数,然后从该组的所有累积和值中减去每个组的第一个bbb。问题是,我不知道如何基于因子来定位每个组的第一个值。

或者我认为使用split / tapply或其他一些apply函数可以更专业地完成它。

这实际上给我带来了一个额外的问题:我在哪里可以找到除了例如?ave?它没有提到我可以使用它的功能以及我可以使用的事实FUN=cumsum我只知道感谢这个论坛。或者这应该是常识,因为它在帮助页面上提到“功能”一词?除了youtube教程之外,我也无法找到有关包的全面信息。我假设,例如,dyplr也会对我的问题有一些优雅的解决方案。我只是不知道怎么做到这一点。谢谢!

2 个答案:

答案 0 :(得分:3)

我们可以删除第一个元素,获取其余元素的cumsum并在FUN ave

内与0连接
with(df, ave(bbb, factor, FUN = function(x) c(0, cumsum(x[-1]))))
#[1]  0  4 10  0  5 12

使用dplyr,我们可以使用与上面相同的连接逻辑

library(dplyr)
df %>% 
   group_by(factor) %>% 
   mutate(cumbbb = c(0, cumsum(bbb[-1])))

或者在{{1}之前创建一个带有row_number()的逻辑索引,乘以'bbb'得到第一个值0(因为FALSE是0而TRUE是1) }}

cumsum

答案 1 :(得分:1)

使用dplyr

的替代解决方案
bbb<-c(2,4,6,3,5,7)
factor<-gl(2,3)
df<-data.frame(bbb,factor)

library(dplyr)

df %>%
  group_by(factor) %>%                                        # for each factor value
  mutate(cs = cumsum(ifelse(row_number() == 1, 0, bbb))) %>%  # replace bbb value in position 1 with 0 and get cumsum
  ungroup()                                                   # forget the grouping

# # A tibble: 6 x 3
#     bbb factor    cs
#   <dbl> <fct>  <dbl>
# 1    2. 1         0.
# 2    4. 1         4.
# 3    6. 1        10.
# 4    3. 2         0.
# 5    5. 2         5.
# 6    7. 2        12.