【问题标题】:Replacing items in a matrix based on column and value in R根据R中的列和值替换矩阵中的项目
【发布时间】:2020-10-24 11:34:09
【问题描述】:

我想知道如何以尽可能自动化的方式替换一系列矩阵中的观察值,这些矩阵的替换规则因矩阵列而异。

我有大量矩阵要处理 (~240)。处理需要用 0 替换一定数量的观察值。每个矩阵具有相同的维度并包含两种类型的列,这需要不同的截止值,在该截止值处,该列中的所有观察值都应替换为 0。矩阵根据截止值而有所不同关闭时应将观察值替换为 0。我已经找到了一种处理数据的方法,但它非常缓慢且需要手动操作,我想知道是否有一种方法可以通过函数自动执行此操作或 for 循环。

例如,在矩阵x 中,如果大于 45,则第 3,4 和 9 列中的观察值需要变为 0,如果大于 70,则所有其他列中的观察值需要变为 0。

我想到了两种替换数据的方法,下面都有详细介绍:

cols <- c(3,4,9)
  
x <- matrix(sample(1:100),10,10)

#attempt 1
x[x>70]  <- 0            # replace all values > 70 with 0 (true for all columns)
x.sub  <- x[,cols]       # subset columns with lower limit
x.sub[x.sub>45]  <- 0    # replace all values > 45 with 0 for the subset (rule 2 columns)
x[,cols]   <- x.sub      # add revised values back to main object

#attempt 2               
x.sub1 <- x[,-cols]      # subset columns that follow rule 1
x.sub1[x.sub1>70] <- 0   # replace all values over 70 with 0
x.sub2  <- x[,cols]      # subset columns that follow rule 2
x.sub2[x.sub3>45] <- 0   # replace all values over 45 with 0
x[,-cols]  <- x.sub1     # add revised values back to main object (rule 1 columns)
x[,cols]   <- x.sub2     # add revised values back to main object (rule 2 columns)

任何帮助将不胜感激!

【问题讨论】:

    标签: r matrix subset


    【解决方案1】:

    如果我们制作一个可重现的矩阵:

    cols <- c(3,4,9)
    
    set.seed(69)
    
    x <- matrix(sample(1:100), 10, 10)
    x
    #>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    #>  [1,]   96   27   74   53   35   20   24   33   50    38
    #>  [2,]   81   36   54   12   19   17   40   44   18    52
    #>  [3,]   91   10   55   15   60   43   88   71   58    82
    #>  [4,]    2   92   32   70    9   63   87   48   16    69
    #>  [5,]   77   78    5   30   79   47   57   72   45    89
    #>  [6,]   39   61   85   75   80   93   37   56   23    46
    #>  [7,]   95   51   67   42   99    3   28    7   26    11
    #>  [8,]    6   76   62   25   65   13   86   49   59     4
    #>  [9,]   97  100   68   83   73    8   31   94   14    34
    #> [10,]   90   84   64   29   22   98    1   66   21    41
    

    我们可以使用一些模运算获得目标列中条目的索引:

    incols <- ((seq_along(x) - 1) %/% nrow(x) + 1) %in% cols
    

    允许直接子集:

    x[x > 70 & !incols]  <- 0
    x[x > 40 & incols]   <- 0
    
    x
    #>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    #>  [1,]    0   27    0    0   35   20   24   33    0    38
    #>  [2,]    0   36    0   12   19   17   40   44   18    52
    #>  [3,]    0   10    0   15   60   43    0    0    0     0
    #>  [4,]    2    0   32    0    9   63    0   48   16    69
    #>  [5,]    0    0    5   30    0   47   57    0    0     0
    #>  [6,]   39   61    0    0    0    0   37   56   23    46
    #>  [7,]    0   51    0    0    0    3   28    7   26    11
    #>  [8,]    6    0    0   25   65   13    0   49    0     4
    #>  [9,]    0    0    0    0    0    8   31    0   14    34
    #> [10,]    0    0    0   29   22    0    1   66   21    41
    

    由reprex package (v0.3.0) 于 2020 年 7 月 3 日创建

    【讨论】:

      【解决方案2】:

      我们也可以使用负索引

      x[, -cols] <- (x[, -cols] <=70) * x[, -cols]
      x[, cols] <- (x[, cols]  <= 45) * x[, cols]
      x
      #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
      # [1,]    0   27    0    0   35   20   24   33    0    38
      # [2,]    0   36    0   12   19   17   40   44   18    52
      # [3,]    0   10    0   15   60   43    0    0    0     0
      # [4,]    2    0   32    0    9   63    0   48   16    69
      # [5,]    0    0    5   30    0   47   57    0   45     0
      # [6,]   39   61    0    0    0    0   37   56   23    46
      # [7,]    0   51    0   42    0    3   28    7   26    11
      # [8,]    6    0    0   25   65   13    0   49    0     4
      # [9,]    0    0    0    0    0    8   31    0   14    34
      #[10,]    0    0    0   29   22    0    1   66   21    41
      

      数据

      cols <- c(3,4,9)
      set.seed(69)
      x <- matrix(sample(1:100), 10, 10)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 2021-02-19
        • 1970-01-01
        相关资源
        最近更新 更多