【问题标题】:R - Using for loop to conditionally change values in a dataframeR - 使用 for 循环有条件地更改数据框中的值
【发布时间】:2016-08-18 17:54:50
【问题描述】:

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 可能会使用某种类型的应用功能,我可以更有效地完成我想要做的事情,但我不确定如何。

如果需要更多信息,我们将不胜感激。

【问题讨论】:

    标签: r for-loop sapply


    【解决方案1】:

    你可以试试(如果你的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

    【讨论】:

    • 这真是太聪明了。
    • @Cath 效果很好!你的方法效率更高。如果可能的话,你明白为什么我的 for 循环没有做我想让他们做的事情吗?如果不是,我相信我可以做进一步的研究以更好地理解 for 循环。
    • @Dre,在您的第一个 for 循环中,您将值 54 更改为 12 与前 2 行但随后,您更改 1s和2s 回到5s 和4s 最后两行,所以它不能工作。在您的第二个 for 循环中,有几个问题,嵌入的 ifelses 太多,但导致错误的原因是您在每个“循环转”处重新分配完整的 df 而不仅仅是列 rpi_invert[[b]]
    • 啊,有道理。感谢您的回答和解释。
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2022-10-14
    • 2019-08-20
    • 2018-09-21
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多