如果在R中满足某个条件,则查找累积产品

时间:2016-12-29 03:09:59

标签: 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值而不是当前行。

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

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

非常感谢帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

您可以将avecumprod一起使用,这会计算按v2分组的列v1的累积产品:

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

答案 1 :(得分:0)

我们可以使用 android:selectedItemPosition="@={model.position}"

data.table