2017-06-27 25 views
2

的每一行循環我有一個數據幀與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 

我需要執行計算使用dplyr每一行作爲我的真實數據幀確實是巨大的,dplyr是非常有效的。

我want-

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 

這是怎麼achieved--

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 +.... 

直到滯後(VAR1)達到BYGROUP_OBSNUM爲0的行0

我已經實現了什麼,直到now--

df1<-df %>% 
    mutate(var3=ifelse ((!(var2==0) | (!(BYGROUP_OBSNUM==0))), var2, 0)) %>% 
    rowwise()%>% 
    ungroup() %>% 
     mutate(var1_new=var1+lag(var1,1)*var2) 

我需要更改的每一行和權力,直到滯後的最後一行使得公式需要從滯後(var1,1)滯後(VAR1,BYGROUP_OBSNUM) var2也從1增加到BYGROUP_OBSNUM。我該怎麼做呢?

+0

我在想'ungroup()'取消了'rowwise()'。所以這沒有做任何事情。 – Axeman

+0

此外,它似乎[ungroup()去掉rowwise_df的tbl_df類](https://github.com/tidyverse/dplyr/issues/936)。 – jsb

+0

yes rowwise is useless ..df1 <-df %>% mutate(var3 = ifelse((!(var2 == 0)|(!(BYGROUP_OBSNUM == 0))),var2,0))%>% mutate(var1_new = var1 + lag(var1,1)* var2) – Riya

回答

1

這是一個自定義函數,可以與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...) 
0

取得了最終的解決方案中場休息

df<-data.frame(var1=c(1:10),var2=c(rep(c(0,0.1),each=5)),BYG‌​ROUP_OBSNUM=c(0:4)) 

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

df1 <- df %>% 
     do(data.frame(., my.func(.))) %>% 
      mutate(VAR1_NEW = my.func...)%>% 
      select(-my.func...) 

完成1.42分鐘100K行!這個功能幫了很多!謝謝!