在数据帧的每一行上使用dplyr循环

Riy*_*iya 6 loops r dataframe dplyr

我有一个数据框

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
Run Code Online (Sandbox Code Playgroud)

我需要使用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
Run Code Online (Sandbox Code Playgroud)

如何实现的:

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
Run Code Online (Sandbox Code Playgroud)

因此,对于每一行,公式为:

 var1[i]+lag(var1,1)*var2^1+lag(var1,2)*var2^2 +.... 
Run Code Online (Sandbox Code Playgroud)

直到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)
Run Code Online (Sandbox Code Playgroud)

我需要更改最后一行,以使该公式将每一行的滞后从lag(var1,1)变为lag(var1,BYGROUP_OBSNUM),并且var2的功效也从1增加到BYGROUP_OBSNUM。我该怎么做呢?

Mat*_*ett 2

这是一个自定义函数,可以与 dplyr 一起使用来产生您想要的结果。group_by它也适用于该功能。

my.func <- function(x){
             mapply(function(v1,v2,n) {
               if(n == 1) {
                 as.numeric(v1[n])
               } else {
                 sum(v1, x[rev(seq(1:(n-1))),1] * v2 ^ seq(1:(n-1)))
               }
             }, x[,"var1"], x[,"var2"], seq(1:nrow(x)))
           }


df <- df %>% 
      # group_by(COLUMNS, TO, GROUP, BY) %>% 
      do(data.frame(., my.func(.))) %>%
      select(var1, var2, BYGROUP_OBSNUM, VAR1_NEW = my.func...)
Run Code Online (Sandbox Code Playgroud)