2016-04-25 57 views
1

所有變量在data.frame 1-5中的規模相同。的data.frameR - 使用for循環來有條件地更改數據幀中的值

rpi_invert 

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

對於等於5所有值我想將其改爲1

實施例。

對於4更改爲2。對於2變更爲4

for 1 change to 5

值更改後的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 
}  

這隻會改變第一行而不是第二列的值。

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這很棒!你的方式更有效率。如果可能的話,你是否明白爲什麼我的循環未能做到我想讓他們做的事情?如果不是,我相信我可以做更多的研究,以更好地理解循環。 – Dre

+0

@Dre,在你的第一個for循環中,你用前兩行改變'5'和'4'的值爲'1'和'2',但是你將'1'和'2'改回到最後2行是'5'和'4',所以無法工作。在你的第二個for循環中,有幾個問題,嵌入式ifelse太多了,但是導致錯誤的原因是你在每個「循環」而不是僅僅列'rpi_invert [[b]]中重新分配完整的df ' – Cath