Replacing occurrences of a number in multiple columns of data frame with another value in R

后端 未结 4 645
-上瘾入骨i
-上瘾入骨i 2020-12-03 03:09

ETA: the point of the below, by the way, is to not have to iterate through my entire set of column vectors, just in case that was a proposed solution (just

相关标签:
4条回答
  • 2020-12-03 03:27

    you want to search through the whole data frame for any value that matches the value you're trying to replace. the same way you can run a logical test like replacing all missing values with 10..

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

    you can also replace all 4s with 10s.

    data[ data == 4 ] <- 10
    

    at least i think that's what you're after?

    and let's say you wanted to ignore the first row (since it's all letters)

    # 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
    
    0 讨论(0)
  • 2020-12-03 03:28

    Just to provide a different answer, I thought I would write up a vector-math approach:

    You can create a transformation matrix (really a data frame here, but will work the same), using a the vectorized 'ifelse' statement and multiply the transformation matrix and your original data, like so:

    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)
    }
    

    To replace all values 4 with 10 in the data frame 'data' in columns 2 through 3, you would use the function like so:

    # 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
    
    0 讨论(0)
  • 2020-12-03 03:36

    Just for continuity

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

    But it looks ugly, So do it in 2 steps is better.

    0 讨论(0)
  • 2020-12-03 03:42

    Basically data[, 2:3]==4 gave you the index for data[,2:3] instead of 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
    

    So you may try this:

    R > data[,2:3][data[, 2:3] ==4]
    [1] 4 4 4 4
    
    0 讨论(0)
提交回复
热议问题