2017-11-30 7 views
1

以前の(新しい計算された)2データポイントに基づいて新しいデータポイントを計算するには、dplyrをRで使用します。しかし、mutate関数は新しい値を直接更新するわけではないので(おそらくそのベクトル化された関数のため)、計算は '古い'値に基づいています。最初の 'ギャップ'は正しく埋められますが、2番目のギャップ(データが2つ欠けている)は問題を引き起こします。R dplyr以前のデータを使用

どうすればこの問題を解決できますか?

library(dplyr) 

temp <- data.frame(new_MAP_top = c(68,71,70,72,NA,75,70,69,69,NA,73,75,83,NA,NA,95,98,97), 
        steps = c(NA,NA,NA,NA,1.50,NA,NA,NA,NA,2.00,NA,NA,NA,4.00,4.00,NA,NA,NA)) 

temp<-temp %>% 
    mutate(
    prev1 = lag(new_MAP_top,1), 
    prev2 = lag(new_MAP_top,2), 
    previous_slope = prev1-prev2, 
    previous_slope = ifelse(is.na(previous_slope), 0, previous_slope), 
    new_MAP_top = ifelse(is.na(steps), new_MAP_top, round(prev1-(previous_slope-(3*steps))/4, digit=2)) 
) 
+1

別の 'mutate'を使用してみませんか? – Clarinetist

+0

それから、私はそれを複数回(100レコード、98回)実行しなければならないので... –

+0

問題を再現できるようにするには、いくつかのデータが必要です。そしてあなたを助けるための理想的な出力。 – AntoniosK

答えて

0

アイデアは、あなたのnew_MAP_top列のすべてのNA秒を更新するために、必要に応じて何度でも(あなたが投稿したもの)あなたのコードを実行するだけです。あなたが言及したように、この問題は、その列の行に複数のNAがあることに起因します。

library(dplyr) 

# example data 
temp <- data.frame(new_MAP_top = c(68,71,70,72,NA,75,70,69,69,NA,73,75,83,NA,NA,95,98,97), 
        steps = c(NA,NA,NA,NA,1.50,NA,NA,NA,NA,2.00,NA,NA,NA,4.00,4.00,NA,NA,NA)) 


# function to fully update a given dataframe 
UpdateDF = function(df) { 

    # while there are NAs in that column 
    while(sum(is.na(df$new_MAP_top)) > 0) { 

     # apply your process 
     df = df %>% 
     mutate(prev1 = lag(new_MAP_top,1), 
      prev2 = lag(new_MAP_top,2), 
      previous_slope = prev1-prev2, 
      previous_slope = ifelse(is.na(previous_slope), 0, previous_slope), 
      new_MAP_top = ifelse(is.na(steps), new_MAP_top, round(prev1-(previous_slope-(3*steps))/4, digit=2)))   
    } 

     # return the updated table when we have no more NAs in that column 
     df 
} 

# apply the function 
UpdateDF(temp) 

# new_MAP_top steps prev1 prev2 previous_slope 
# 1  68.00 NA NA NA   0.00 
# 2  71.00 NA 68.00 NA   0.00 
# 3  70.00 NA 71.00 68.00   3.00 
# 4  72.00 NA 70.00 71.00   -1.00 
# 5  72.62 1.5 72.00 70.00   2.00 
# 6  75.00 NA 72.62 72.00   0.62 
# 7  70.00 NA 75.00 72.62   2.38 
# 8  69.00 NA 70.00 75.00   -5.00 
# 9  69.00 NA 69.00 70.00   -1.00 
# 10  70.50 2.0 69.00 69.00   0.00 
# 11  73.00 NA 70.50 69.00   1.50 
# 12  75.00 NA 73.00 70.50   2.50 
# 13  83.00 NA 75.00 73.00   2.00 
# 14  84.00 4.0 83.00 75.00   8.00 
# 15  86.75 4.0 84.00 83.00   1.00 
# 16  95.00 NA NA 84.00   0.00 
# 17  98.00 NA 95.00 NA   0.00 
# 18  97.00 NA 98.00 95.00   3.00 

不要な列を削除するには、必要なものを正確に返すように関数を調整します。

関連する問題