2016-04-25 59 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