【发布时间】:2017-11-30 07:59:05
【问题描述】:
我有一个数据框
df <- data.frame(var1=c(10,20,30,40,50), var2=c(rep(0.3,5)), BYGROUP_OBSNUM=c(0:4))
var1 var2 BYGROUP_OBSNUM
10 0.3 0
20 0.3 1
30 0.3 2
40 0.3 3
50 0.3 4
我需要使用 dplyr 对每一行执行计算,因为我的真实数据框非常庞大,并且 dplyr 非常高效。
我想要什么:
var1 var2 BYGROUP_OBSNUM VAR1_NEW
10 0.3 0 10
20 0.3 1 23
30 0.3 2 36.9
40 0.3 3 51.07
50 0.3 4 65.321
这是如何实现的:
var1 var2 BYGROUP_OBSNUM VAR1_NEW
10 0.3 0 10
20 0.3 1 20+10*0.3
30 0.3 2 30+20*0.3+10*0.3^2
40 0.3 3 40+30*0.3+20*0.3^2+10*0.3^3
50 0.3 4 50+40*0.3+30*0.3^2+20*0.3^3+10*0.3^4
因此对于每一行,公式为:
var1[i]+lag(var1,1)*var2^1+lag(var1,2)*var2^2 +....
直到 lag(var1) 到达 BYGROUP_OBSNUM 为 0 的行
到目前为止我已经取得的成就:
df1<-df %>%
mutate(var3=ifelse ((!(var2==0) | (!(BYGROUP_OBSNUM==0))), var2, 0)) %>%
rowwise()%>%
ungroup() %>%
mutate(var1_new=var1+lag(var1,1)*var2)
我需要更改最后一行,以便公式将每行的滞后从 lag(var1,1) 变为 lag(var1,BYGROUP_OBSNUM),并且 var2 的幂也从 1 增加到 BYGROUP_OBSNUM。我该怎么做?
【问题讨论】:
-
我猜
ungroup()取消了rowwise()。所以这没有做任何事情。 -
是的 rowwise 没用..df1% mutate(var3=ifelse ((!(var2==0) | (!(BYGROUP_OBSNUM==0))), var2, 0 )) %>% 变异(var1_new=var1+lag(var1,1)*var2)
-
不确定你的分组是什么,但在基础 R 中你可以做类似
with(df, sapply(seq_along(var1), function(i) sum(var1[seq_len(i-1)]*0.3^(rev(seq_len(i-1))))) + var1) -
这有帮助,但仅适用于小型数据集。即使是 1 百万行的数据集也需要很长时间。有一些分类变量用于分组,在 BYGROUP_OBSNUM 列的基础上进行分组。