我有一个数据框,其中的组由一个因子值定义。我正在尝试添加一个基于每个组的累积总和的列。
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也会对我的问题有一些优雅的解决方案。我只是不知道怎么做到这一点。谢谢!
答案 0 :(得分:3)
我们可以删除第一个元素,获取其余元素的cumsum
并在FUN
ave
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.