我有一些数据,如下面的数据框:

df = data.frame(name=c(rep("Group1",5),rep("Group2",5)),
                mon=c(1,2,3,4,5,1,2,3,4,5),
                amt=c(10,NA,NA,NA,NA,15,NA,NA,NA,NA),
                inc=c(.1,.1,.2,.2,.3,.1,.1,.2,.2,.3))

df

     name mon amt inc
1  Group1   1  10 0.1
2  Group1   2  NA 0.1
3  Group1   3  NA 0.2
4  Group1   4  NA 0.2
5  Group1   5  NA 0.3
6  Group2   1  15 0.1
7  Group2   2  NA 0.1
8  Group2   3  NA 0.2
9  Group2   4  NA 0.2
10 Group2   5  NA 0.3

有多个组,第一个金额列(AMT)已填充,但组中的其余部分为空.我还有另一个列(INC),它是我想增加Amount字段的百分比,如果它当前为空的话.当我到达下一组时,我想重新开始这一过程.

例如,Group1 MON 2将是10*(1+0.1)=11,MON 3将是先前计算的MON 2值的20%的增加:11*(1+0.2)=13.2,依此类推.

我一直在try 使用dplyr和Lag函数,但我要么无法让它工作,要么它不是为此而构建的,我不知道哪种函数可以工作.我能够使用循环来迭代数据帧,并获得我想要的结果,但我希望更优雅地做这件事,使我成为一个使用R更好的编码者.

下面是我构建的当前正在运行的循环:

for (i in 1:nrow(df)){
  df$amt[i] = ifelse(df$mon[i]==1,
         df$amt[i],
         df$amt[i-1]*(1+df$inc[i]))
}

df

     name mon    amt inc
1  Group1   1 10.000 0.1
2  Group1   2 11.000 0.1
3  Group1   3 13.200 0.2
4  Group1   4 15.840 0.2
5  Group1   5 20.592 0.3
6  Group2   1 15.000 0.1
7  Group2   2 16.500 0.1
8  Group2   3 19.800 0.2
9  Group2   4 23.760 0.2
10 Group2   5 30.888 0.3

推荐答案

您可能会遇到dplyr::lag()的问题,因为它lag(amt)将提供列的lag()NA个值,而不是随着您迭代填充每个值而更新的向量.

您可以使用Reduce()函数来实现该行为(见下文).但是,在本例中,您可以使用cumprod()将第一个amt值乘以GROUP BY的累积值.

df |>
    mutate(
        amt = amt[1] * c(1, cumprod(1 + tail(inc, -1))),
        .by = name
    )

#      name mon    amt inc
# 1  Group1   1 10.000 0.1
# 2  Group1   2 11.000 0.1
# 3  Group1   3 13.200 0.2
# 4  Group1   4 15.840 0.2
# 5  Group1   5 20.592 0.3
# 6  Group2   1 15.000 0.1
# 7  Group2   2 16.500 0.1
# 8  Group2   3 19.800 0.2
# 9  Group2   4 23.760 0.2
# 10 Group2   5 30.888 0.3

Using Reduce()

下面是使用Reduce()实现相同结果的类似方法.这将是较慢的,但可能会更好地了解正在一步步发生的事情.

df |>
    split(~name) |>
    lapply(\(dat)
    transform(dat, amt = Reduce(
        \(x, y) x * (1 + y), tail(dat$inc, -1),
        init = dat$amt[1], accumulate = TRUE
    ))) |>
    do.call(rbind, args = _)

R相关问答推荐

geom_raster不适用于x比例中超过2,15的值

从多个前置日期中获取最长日期

在(g)子中使用asserable字符

R箱形图gplot 2 4组但6个参数

大规模重新标记haven标签数据

根据选中三个复选框中的一个或两个来调整绘图

如何调整曲线图中的y轴标签?

打印XTS对象

将一个字符串向量调整为与其他字符串向量完全相同的大小

根据约束随机填充向量的元素

WRS2包中带有bwtrim的简单ANOVA抛出错误

如何删除R中除数字元素以外的所有元素

有没有办法定制Plot(allEffects())面板标题?

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

计算来自单独分组的分幅的值的百分位数

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

R将函数参数传递给ggploy

使用一个标签共享多个组图图例符号

GgHighlight找不到它创建的列:`Highlight..1`->;`Highlight.....`

如何从矩阵绘制环弦图