Scaling a numeric matrix in R with values 0 to 1

前端 未结 5 653
日久生厌
日久生厌 2020-12-09 10:43

Here is an excerpt of numeric matrix that I have

 [1,]   30 -33.129487   3894754.1 -39.701738 -38.356477 -34.220534
 [2,]   29 -44.289487  -8217525.9 -44.801         


        
相关标签:
5条回答
  • 2020-12-09 10:46

    Not the prettiest but this just got the job done, since I needed to do this in a dataframe.

    column_zero_one_range_scale  <- function(
    input_df,
    columns_to_scale #columns in input_df to scale, must be numeric
    ){
    
    input_df_replace <- input_df
    
    columncount <- length(columns_to_scale)
    for(i in 1:columncount){
    
    columnnum <- columns_to_scale[i]
    
    if(class(input_df[,columnnum]) !='numeric' & class(input_df[,columnnum])!='integer')
      {print(paste('Column name ',colnames(input_df)[columnnum],' not an integer or numeric, will skip',sep='')) }
    
    
    if(class(input_df[,columnnum]) %in% c('numeric','integer'))
    {
      vec <- input_df[,columnnum]
      rangevec <- max(vec,na.rm=T)-min(vec,na.rm=T)
      vec1 <- vec - min(vec,na.rm=T)
      vec2 <- vec1/rangevec
    }
    input_df_replace[,columnnum] <- vec2
    colnames(input_df_replace)[columnnum] <- paste(colnames(input_df)[columnnum],'_scaled')
    
    }
    
    return(input_df_replace)
    
    
    }
    
    0 讨论(0)
  • 2020-12-09 10:47

    And if you were still to use scale:

    maxs <- apply(a, 2, max)
    mins <- apply(a, 2, min)
    scale(a, center = mins, scale = maxs - mins)
    
    0 讨论(0)
  • 2020-12-09 10:49

    Install the clusterSim package and run the following command:

    normX = data.Normalization(x,type="n4");
    
    0 讨论(0)
  • 2020-12-09 11:00

    Try the following, which seems simple enough:

    ## Data to make a minimal reproducible example
    m <- matrix(rnorm(9), ncol=3)
    
    ## Rescale each column to range between 0 and 1
    apply(m, MARGIN = 2, FUN = function(X) (X - min(X))/diff(range(X)))
    #           [,1]      [,2]      [,3]
    # [1,] 0.0000000 0.0000000 0.5220198
    # [2,] 0.6239273 1.0000000 0.0000000
    # [3,] 1.0000000 0.9253893 1.0000000
    
    0 讨论(0)
  • 2020-12-09 11:06

    scales package has a function called rescale:

    set.seed(2020)
    
    x <- runif(5, 100, 150)
    scales::rescale(x)
    #1.0000000 0.5053362 0.9443995 0.6671695 0.0000000
    
    0 讨论(0)
提交回复
热议问题