![](/img/trans.png)
[英]r function to find if condition is met and then add column with cumulative difference
[英]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:
因此,在此示例中,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)。
非常感谢您的帮助,谢谢!
您可以将ave
与cumprod
一起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
包,您可以将ddply
与transform
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.