繁体   English   中英

如果R中满足特定条件,则查找累积乘积

[英]Finding cumulative product if a certain condition is met in R

我有一个看起来像下面的数据集(称为数据):

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 <-c(NA,Data [1:nrow(Data)-1,1])来滞后于v1列,以便与上一行进行比较。 我认为类似以下内容的方法应该可以工作,但是在上一行而不是当前行中使用v3的值。

Data $ v3 <-ifelse(1 *(Data $ v1 == lag.v1)== 1,Data $ v3 * Data $ v2,Data $ v2)

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

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

您可以将avecumprod一起cumprod ,这将计算按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 ddply使用:

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

我们可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM