【问题标题】:Replacing occurrences of a number in multiple columns of data frame with another value in R用R中的另一个值替换数据框多列中出现的数字
【发布时间】:2013-01-22 03:57:30
【问题描述】:

ETA: 顺便说一下,下面的重点是不必遍历我的整个列向量集,以防万一这是一个建议的解决方案(只做已知的一次工作一次)。


有很多用其他值替换 R 中数据框的 single 向量中的值的示例。

以及如何将NA 的所有值替换为其他值:

我正在寻找的是类似于最后一个问题,但基本上是试图用另一个值替换一个值。对于多列满足条件的情况,或者只是尝试对多列执行前两个问题中的操作,我无法生成映射到实际数据框的逻辑值数据框。

一个例子:

data <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep(1:9), var2 = rep(3:5, each = 3))

data
  name var1 var2
1    a    1    3
2    a    2    3
3    a    3    3
4    b    4    4
5    b    5    4
6    b    6    4
7    c    7    5
8    c    8    5
9    c    9    5

假设我希望var1var24 的所有值都为10

我确定这是基本的,我只是没有正确考虑它。我一直在尝试这样的事情:

data[data[, 2:3] == 4, ]

这不起作用,但如果我对data[, 2] 而不是data[, 2:3] 做同样的事情,一切正常。似乎逻辑测试(如is.na())适用于多行/多列,但数值比较效果不佳?

感谢您的任何建议!

【问题讨论】:

    标签: r replace indexing


    【解决方案1】:

    您想在整个数据框中搜索与您尝试替换的值匹配的任何值。与您可以运行逻辑测试的方式相同,例如将所有缺失值替换为 10..

    data[ is.na( data ) ] <- 10
    

    你也可以用 10 替换所有的 4。

    data[ data == 4 ] <- 10
    

    至少我认为这就是你所追求的?

    假设你想忽略第一行(因为都是字母)

    # identify which columns contain the values you might want to replace
    data[ , 2:3 ]
    
    # subset it with extended bracketing..
    data[ , 2:3 ][ data[ , 2:3 ] == 4 ]
    # ..those were the values you're going to replace
    
    # now overwrite 'em with tens
    data[ , 2:3 ][ data[ , 2:3 ] == 4 ] <- 10
    
    # look at the final data
    data
    

    【讨论】:

    • 我发誓我试过这个,但它以前不适合我。我希望能够达到这样的地步,即我不会每次发布到 SO...那些石头。
    【解决方案2】:

    基本上data[, 2:3]==4 为您提供data[,2:3] 的索引,而不是data

    R > data[, 2:3] ==4
           var1  var2
     [1,] FALSE FALSE
     [2,] FALSE FALSE
     [3,] FALSE FALSE
     [4,]  TRUE  TRUE
     [5,] FALSE  TRUE
     [6,] FALSE  TRUE
     [7,] FALSE FALSE
     [8,] FALSE FALSE
     [9,] FALSE FALSE
    

    所以你可以试试这个:

    R > data[,2:3][data[, 2:3] ==4]
    [1] 4 4 4 4
    

    【讨论】:

    • 谢谢你;也有效。我只是觉得安东尼的那个更简单一点。非常感谢您解释了为什么我的不起作用;在玩了更多之后,我明白了你的意思:我尝试根据也是子集的比较将值应用于数据更有意义。
    【解决方案3】:

    只是为了延续

        data[,2:3][ data[,2:3] == 4 ] <- 10
    

    但是看起来很难看,所以分两步做比较好。

    【讨论】:

      【解决方案4】:

      只是为了提供不同的答案,我想我会写一个向量数学方法:

      您可以使用矢量化的“ifelse”语句创建一个转换矩阵(这里实际上是一个数据框,但工作原理相同),并将转换矩阵与您的原始数据相乘,如下所示:

      df.Rep <- function(.data_Frame, .search_Columns, .search_Value, .sub_Value){
         .data_Frame[, .search_Columns] <- ifelse(.data_Frame[, .search_Columns]==.search_Value,.sub_Value/.search_Value,1) * .data_Frame[, .search_Columns]
          return(.data_Frame)
      }
      

      要将第 2 到第 3 列的数据框“数据”中的所有值 4 替换为 10,您可以使用如下函数:

      # Either of these will work.  I'm just showing options.
      df.Rep(data, 2:3, 4, 10)
      df.Rep(data, c("var1","var2"), 4, 10)
      
      #   name var1 var2
      # 1    a    1    3
      # 2    a    2    3
      # 3    a    3    3
      # 4    b   10   10
      # 5    b    5   10
      # 6    b    6   10
      # 7    c    7    5
      # 8    c    8    5
      # 9    c    9    5
      

      【讨论】:

      • test 应该是data,不是吗? :)
      猜你喜欢
      • 2016-01-03
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 2016-08-27
      • 2022-10-05
      • 2021-09-08
      相关资源
      最近更新 更多