2017-02-09 3 views
1

を使用して遅れ値で価値の交換します。効果的に、yが非ゼロの場合、xはyの値を取り、yが0の場合、xは遅れたx値の値をとります。基本的には、xの値を行ごとに置き換えています。 forループでこれを行うことは簡単です -反復は、私は、次のデータフレームを有するdplyr

for (i in 1:nrow(data)) { 
    data$x[i] <- 
    ifelse(data$y[i] == 1, 1, ifelse(data$y[i] == -1, -1, data$x[i-1]))} 

本当に大規模なデータセット上で、しかし私に(私が探しています何)この出力

x y 
1 NA 0 
2 NA 0 
3 NA 0 
4 1 1 
5 1 0 
6 -1 -1 
7 -1 0 
8 -1 -1 
9 -1 0 
10 1 1 
11 1 0 
12 -1 -1 
13 -1 0 
14 1 1 
15 1 0 
16 1 0 
17 1 0 

を手渡す、forループこれは非常に非効率的です。私は、しかし、私が管理している最善の解決策は、トリックこの

x y 
1 NA 0 
2 1 0 
3 1 0 
4 1 1 
5 1 0 
6 0 -1 
7 1 0 
8 0 -1 
9 1 0 
10 1 1 
11 1 0 
12 0 -1 
13 1 0 
14 1 1 
15 1 0 
16 1 0 
17 1 0 

私の推測がある返す

data2 <- data.frame(x,y) 

data2 <- 
    data2 %>% 
    mutate(x = ifelse(y == 1, 1, ifelse(y == -1, 0, Lag(x)))) 

を行いませんを考え出すdplyrでこれを実装したいのですが、そのようI dplyrでこれを行うよう現在試みていますが、私がやりたいことの反復的な性質を制御しません。つまり、行を移動するときにxを置き換えます。どのように私はdplyrを通じてこれを行うことができるかについて誰かが考えていますか?

+3

からna.locfを使用しています-ceroax(as.logical(y)* seq_along(y))でゼロを "y"に変換します。次に、ゼロを「NA」に置き換え、サブセット「y」は結果を与えるべきである。 –

答えて

1

1つのオプションは、NA0を交換して、前方の塗りつぶしを行うことです。ここでは

library(dplyr); library(tidyr) 
data %>% mutate(x = na_if(y, 0)) %>% fill(x) 

# x y 
#1 NA 0 
#2 NA 0 
#3 NA 0 
#4 1 1 
#5 1 0 
#6 -1 -1 
#7 -1 0 
#8 -1 -1 
#9 -1 0 
#10 1 1 
#11 1 0 
#12 -1 -1 
#13 -1 0 
#14 1 1 
#15 1 0 
#16 1 0 
#17 1 0 
+0

@Psidon - これに感謝します。エレガントに仕事をします。 –

0

は別のオプションは、あなたが最後の非のインデックスを取得することができますzoo

library(zoo) 
data$x <- with(data, na.locf(y*(NA^!y), na.rm=FALSE)) 
関連する問題