R - 使用for循环有条件地更改数据帧中的值

时间:2016-04-25 11:11:29

标签: r for-loop sapply

data.frame 1-5中的所有变量都处于相同的比例。

data.frame

的示例
rpi_invert

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

对于所有等于5的值,我想将其更改为1

4更改为2

2更改为4

1更改为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可能具有某种类型的应用功能,但我不确定如何。

如果需要进一步的信息,请与我们联系。

1 个答案:

答案 0 :(得分: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