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

Dre*_*Dre 1 for-loop r 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   
Run Code Online (Sandbox Code Playgroud)

对于所有相等的值,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
Run Code Online (Sandbox Code Playgroud)

我累了.

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
}     
Run Code Online (Sandbox Code Playgroud)

这只会更改第一行而不是第二列中的值.

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]]))))
}
Run Code Online (Sandbox Code Playgroud)

但这给了我错误:

Error in rpi_invert[[b]] : subscript out of bounds
Run Code Online (Sandbox Code Playgroud)

如果我为单个列尝试相同的方法而不是循环遍历data.frame,那么这两种方法都有效,所以我不确定是什么问题.

我确信我想要做的事情可以更有效率地完成而不需要for loop某种类型的应用功能,但我不确定如何.

如有任何帮助,请告知我们是否需要进一步的信息.

Cat*_*ath 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
Run Code Online (Sandbox Code Playgroud)

或者,相同但写得有点不同: 6-df

  • 那真的很聪明. (2认同)