2017-04-11 3 views
2

だからこれは私が持っているいくつかのサンプルデータです:条件文の後に値を複製していますか?

signal1 signal2 signal3 
1   0   1   
1   1   1 
1   0   1 
1   0   1 
1   0   1 
1   0   1 
1   0   0 

そして、私は4番目の列を追加したい、signal1==signal2==signal3は両方とも1ある時はいつでも、新しい列が1から0

にSignal3信号が変化するまで1秒を繰り返していることな

signal1 signal2 signal3 signal_generate 
1   0   1   0 
1   1   1   1 
1   0   1   1 
1   0   1   1 
1   0   1   1 
1   0   1   1 
1   0   0   0 

私は、これはifelse文によって達成されるだろうと思っていますが、私はこの一見単純な作業を超える難易度の多くを持っている:

は、したがって、上記の例から、私のような何かを生成します。私はの線に沿って何かをやってと思っています:

signal_generate <- ifelse(data[,1]==data[,2]&data[,3]>0, rep(data[,3]==1), 0)

しかし、私は正しい回数を繰り返すsignal3を取得する方法を見つけ出すことはできません。

編集:ifelseは、条件signal1 == signal2 == signal3が正確に会う行だけを見るため、愚かになることを認識しています。私はまだひどく立ち往生していて、大いに助けになるでしょう! Replacing NAs with latest non-NA value

からの助けを借りて

答えて

1

私は初期条件が正しく処理されていることを確認していません。

df <- read.table(text=" 
signal1 signal2 signal3 
1   0   1   
1   1   1 
1   0   1 
1   0   1 
1   0   1 
1   0   1 
1   0   0 
", header=TRUE) 

library(zoo) 

# apply the logic using RowSums as a shortcut 
df$triple <- as.integer((rowSums(df[,1:3])) == 3L) 

# detect the change in signal and sett the initial condition 
df$signal_change <- ifelse(df$triple == 1L, 1L, ifelse(df$signal3 == 0L, 0, NA)) 
df$signal_change[1] <- df$triple[1] 

# generate the signal by carryign forward the changes 
df$signal_generate <- na.locf(df2$signal_change, na.rm=FALSE) 
df$signal_generate[1] <- df$signal_change[1] 

df 

# signal1 signal2 signal3 triple signal_change signal_generate 
# 1  1  0  1  0    0    0 
# 2  1  1  1  1    1    1 
# 3  1  0  1  0   NA    1 
# 4  1  0  1  0   NA    1 
# 5  1  0  1  0   NA    1 
# 6  1  0  1  0   NA    1 
# 7  1  0  0  0    0    0 
+0

ありがとうございました。簡単な質問ですが、 'as.integer((rowSums(df [、1:3]))== 3L'はテーブルでしか動作しませんか、' data.frame'で使用できますか?それはすべてのために '0'を返しました。 – Nikitau

+0

rowSumsのヘルプから" ...数値配列(またはデータフレーム) "です。あなたのデータの例はありません - 'dput'を使い、私の例はデータフレームです。私は内側から外側に向かって最小のコードを実行してデバッグし、結果を調べることをお勧めします。また、カッコを確認してください – epi99

関連する問題