【问题标题】:Finding cumulative product if a certain condition is met in R如果在 R 中满足某个条件,则查找累积乘积
【发布时间】:2016-12-29 03:09:59
【问题描述】:

我有一个如下所示的数据集(称为数据):

v1 v2
1   1  
1   3
1   5
2   3
2   4
3   1
3   2

我想返回一个向量 v3:

  • 如果 v1[i] 不等于 v1[i-1],则等于 v2[i]
  • 如果 v1[i] 等于 v1[i-1],则等于 v3[i-1]*v2[i]

所以,在这个例子中,v3 应该返回

v3
1
3
15
3
12
1
2

为了与前一行进行比较,我使用 lag.v1

数据$v3

换句话说,当我在上面的等式中形成 v3 时,我需要以某种方式访问​​ v3 的前一行(滞后 v3)。

非常感谢您的帮助,谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以将avecumprod 一起使用,这将计算由v1 分组的v2 列的累积乘积:

    df$v3 <- with(df, ave(v2, v1, FUN=cumprod))
    
    df
    #  v1 v2 v3
    #1  1  1  1
    #2  1  3  3
    #3  1  5 15
    #4  2  3  3
    #5  2  4 12
    #6  3  1  1
    #7  3  2  2
    

    使用plyr 包,您可以使用ddplytransform

    plyr::ddply(df, "v1", transform, v3 = cumprod(v2))
    
    #  v1 v2 v3
    #1  1  1  1
    #2  1  3  3
    #3  1  5 15
    #4  2  3  3
    #5  2  4 12
    #6  3  1  1
    #7  3  2  2
    

    如果您还没有,您可能还想知道dplyr 方法:

    library(dplyr)
    df %>% group_by(v1) %>% mutate(v3 = cumprod(v2))
    
    #Source: local data frame [7 x 3]
    #Groups: v1 [3]
    
    #     v1    v2    v3
    #  <int> <int> <dbl>
    #1     1     1     1
    #2     1     3     3
    #3     1     5    15
    #4     2     3     3
    #5     2     4    12
    #6     3     1     1
    #7     3     2     2
    

    【讨论】:

    • 是否可以使用 ave 方法并按 2 个不同的列分组?
    • 您可以在值向量之后将多个组变量传递给 ave。例如,如果您有g1g2 变量并且值列为v,那么您可以使用with(df, ave(v, g1, g2, FUN=cumprod))
    • 非常简洁的答案!感谢ave 广告cumprod
    【解决方案2】:

    我们可以使用data.table

    library(data.table)
    setDT(df)[, v3 := cumprod(v2), by = v1]
    df
    #   v1 v2 v3
    #1:  1  1  1
    #2:  1  3  3
    #3:  1  5 15
    #4:  2  3  3
    #5:  2  4 12
    #6:  3  1  1
    #7:  3  2  2
    

    【讨论】:

    • 这很有帮助,谢谢。是否可以按 2 个不同的列分组?如中,两列中的值必须相同才能获取 cumprod。
    • @user7352235 是的,您可以通过setDT(df)[, v3 := cumprod(v2), by = .(col1, col2)] 来完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2021-09-12
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    相关资源
    最近更新 更多