2016-04-25 32 views
1

すべての変数はdata.frame 1-5の同じスケールにあります。私は1にそれを変更したい5と等しく、すべての値についてdata.frameR - forループを使用してデータフレームの値を条件付きで変更する

rpi_invert 

A B C D 
5 2 4 1 
3 5 5 2 
1 1 3 4 

例。

42に変更してください。

24に変更してください。

15に変更してください。

値の変更後のdata.frameの例。

rpi_invert 

A B C D 
1 4 2 5 
3 1 1 4 
5 5 3 2 

私は疲れました。

for(b in colnames(rpi_invert)){ 
    rpi_invert[[b]][rpi_invert[[b]] == 5] <- 1 
    rpi_invert[[b]][rpi_invert[[b]] == 4] <- 2 
    rpi_invert[[b]][rpi_invert[[b]] == 2] <- 4 
    rpi_invert[[b]][rpi_invert[[b]] == 1] <- 5 
}  

これは、最初の行の値のみを変更し、2番目の列は変更しません。

for(b in colnames(rpi_invert)){ 
rpi_invert <- ifelse(rpi_invert[[b]] == 5,1, 
        ifelse(rpi_invert[[b]] == 4,2, 
          ifelse(rpi_invert[[b]] == 2,4, 
            ifelse(rpi_invert[[b]] == 1,5,rpi_invert[[b]])))) 
} 

しかし、これは私にエラーを与える:

Error in rpi_invert[[b]] : subscript out of bounds 

私が代わりにdata.frameをループの個々の列に同じ方法にしようとした場合、両方の方法は、私は何かわからない仕事問題です。

私がしようとしていることはおそらくfor loopが適用機能のある種のものでなくても、より効率的に行うことができると確信していますが、わかりません。

さらに詳しい情報が必要な場合は、私にお知らせください。

答えて

8

(あなたのdata.frameがdfある場合)あなたが試すことができます:

3-(df-3) 
# A B C D 
#1 1 4 2 5 
#2 3 1 1 4 
#3 5 5 3 2 

または、同じですが、異なるビット書か:6-df

+2

本当に賢いです。 – nrussell

+0

@Cathそれはすごくうまくいった!あなたの方法ははるかに効率的です。可能ならば私のforループがなぜ私がしたかったことをしなかったのか理解していますか?そうでなければ、私はループについてもっと理解するためにさらなる研究をすることができると確信しています。 – Dre

+0

@Dre、あなたの最初のforループでは、最初の2行で '5'と' 4'を '1'と' 2'に変更しますが、 '1'と' 2'を ' '5'と' 4'を最後の2行と組み合わせると動作しません。あなたの2番目のforループには、いくつかの問題があります。埋め込まれた 'ifelse'があまりにも多くありますが、' rpi_invert [[b]]カラムの代わりに完全なdfを各 "loop turn" ' – Cath

関連する問題