2016-08-05 12 views
0

私はRにはかなり新しく、それに取り組んだ経験はありますが、あまり流暢ではありません。 私は最近、大きなデータセットのデータセットを扱い、R 3.3.1を同じデータセットに使用しました。 データフレーム(X)には、フラグ型の列と数値型の2つの列、つまり高さと重さがあります。何かのように複数の条件を1つのIFループに入れてR

値は次のとおりです。私は今、0

X$h_1 <- 0 
X$w_1 <- 0 

にH_1とW_1ように2つの新しい列を初期化している

h  w  hw_flag 
5.874 60.5478 0 
4.874 40.5478 0 
3.874 10.5478 1 
2.999 6.5478  1 
8.874 90.5478 0 
5.111 50.5478 1 
6.554 65.5478 0 

、私がしたいことはあるhw_flagが1であるときはいつでも、 h_1とw_1はそれぞれhとwからコピーされたエントリを取得し、h_1とw_1に値がコピーされると対応するhとwの値は0になるはずです。私は入れてみました

for(i in 1:nrow(X)){ 
    if(X$hw_flag[i] == '1') 
    X$h_1[i] <- X$h[i]; 
} 

for(i in 1:nrow(X)){ 
    if(X$hw_flag[i] == '1') 
    X$w_1[i] <- X$w[i]; 
} 

for(i in 1:nrow(X)){ 
    if(X$hw_flag[i] == '1') 
    X$h[i] <- 0; 
} 

for(i in 1:nrow(X)){ 
    if(X$hw_flag[i] == '1') 
    X$w[i] <- 0; 
} 

Output : 

h  w   hw_flag h_1 w_1 
5.874 60.5478   0  0 0 
4.874 40.5478   0  0 0 
0  0    1  3.874 10.5478 
0  0    1  2.999 6.5478  
8.874 90.5478   0  0  0 
0   0    1  5.111 50.5478 
6.554 65.5478   0  0  0 

次のとおりであり、それは私が持っているしたい所望の出力を与えている

は今、私は私が働いているこれら4 steps.Theコードの4つのループを記述する必要があります1つのループではすべてが、しかし私が直面していた問題は、最初のステップが期待通りに実行され、2つ目のステップが正しく機能しないということです。私は置くことを試みた; Enterを使って改行しても、それでも問題は解決しませんでした。 私は従っていましたが試したし、H_1する時間値をコピーしたが、次のステップで、それはW_1へワットの値をコピーしていないコード:

for(i in 1:nrow(X)) { 
    if(X$hw_flag[i] == '1') 
    X$h_1[i] <- X$h[i]; 
    X$w_1[i] <- X$w[i]; 
    X$h[i] <- 0; 
    X$w[i] <- 0; 
    } 

だから、私は基本的にどのように私ができることを知りたいです同じIF-Yesブロックに対して複数のthen文を入力します。

+0

てみてください'for'ループのために行われました。 – rosscova

+1

Rの中で ';'を使う必要はありません。 –

+0

ありがとう@rosscova、私は何とかそれらのブレースを見逃しました。 – PD1

答えて

3

ループは不要です。 hw_flagが1と等しい場所を見つけて、データをコピーして、hwをゼロで上書きします。実行される

xy <- read.table(text = "h  w  hw_flag 
5.874 60.5478 0 
       4.874 40.5478 0 
       3.874 10.5478 1 
       2.999 6.5478  1 
       8.874 90.5478 0 
       5.111 50.5478 1 
       6.554 65.5478 0", header = TRUE) 

xy$h_1 <- 0 
xy$w_1 <- 0 

hwflag1 <- xy$hw_flag == 1 
xy[hwflag1, c("h_1", "w_1")] <- xy[hwflag1, c("h", "w")] 
xy[hwflag1, c("h", "w")] <- 0 

     h  w hw_flag h_1  w_1 
1 5.874 60.5478  0 0.000 0.0000 
2 4.874 40.5478  0 0.000 0.0000 
3 0.000 0.0000  1 3.874 10.5478 
4 0.000 0.0000  1 2.999 6.5478 
5 8.874 90.5478  0 0.000 0.0000 
6 0.000 0.0000  1 5.111 50.5478 
7 6.554 65.5478  0 0.000 0.0000 
+0

私は、 "行**をループする必要はありません**"と言います。ベクトルのループは、行列の変換やメソッドのディスパッチを避けるため、ベクトル化された演算よりも優れています。ちょうど:) :)と言ってください。 –

+0

Romanと@DavidArenburgありがとうございます。このコードはうまく動作し、ループを実行するより複雑さが少なくなります。 – PD1

+0

@DavidArenburg:あなたが言った部分についてもう少し詳しく知ることができますか?同じもののリンクがあると、それをよりよく理解するのに役立ちます。私は、操作やメソッドのディスパッチを上回ったことについてあなたが言ったことの詳細なバージョンを探しています。 – PD1

0

コマンドは実際に中括弧内に含まれるべきである。何と同じように、中括弧で `if`文で実行するコマンドを取り巻く

for(i in 1:nrow(X)) { 
    if(X$hw_flag[i] == '1') { 
     X$h_1[i] <- X$h[i] 
     X$w_1[i] <- X$w[i] 
     X$h[i] <- 0 
     X$w[i] <- 0 
    } 
} 
関連する問題