【问题标题】:Matrix Manipulation based on threshold vectors in R基于 R 中阈值向量的矩阵操作
【发布时间】:2013-06-28 16:41:14
【问题描述】:

我有一个如下的数值矩阵

1 2 3 4 5 
1 4 6 1 4
2 4 1 6 8 
1 7 3 6 7
1 4 5 6 2

我有一个向量 c(2,4,2,6,8)

对于每一行,我想在向量中取相应的值并创建一个新矩阵,其中 行中大于向量值的所有值都变为 0。

输出应该是这样的

1 2 0 0 0   # greater than 2 is changed to 0
1 4 0 1 4   # greater than 4 changed to 0
2 0 1 0 0   # greater than 2 changed to 0
1 0 3 6 0   # greater than 6 changed to 0
1 4 5 6 2   # greater than 8 changed to 0

有没有办法在不通过循环实际编码的情况下做到这一点?

【问题讨论】:

    标签: r loops matrix matrix-indexing


    【解决方案1】:
    DF <- read.table(text="1 2 3 4 5
    1 4 6 1 4
    2 4 1 6 8
    1 7 3 6 7
    1 4 5 6 2") 
    
    m <- as.matrix(DF)
    v <- c(2,4,2,6,8)
    
    m * (m <= v)
    #      V1 V2 V3 V4 V5
    # [1,]  1  2  0  0  0
    # [2,]  1  4  0  1  4
    # [3,]  2  0  1  0  0
    # [4,]  1  0  3  6  0
    # [5,]  1  4  5  6  2
    

    【讨论】:

      【解决方案2】:

      是的,您可以:

      m <- matrix(sample(10,25,replace = TRUE),5,5)
      > m[m > matrix(c(2,6,8,4,5),5,5)] <- 0
      

      我编了一个不同的例子,因为你的例子不容易重现。

      或者正如 DWin 指出的,R 会为你做矩阵构造:

      m[m > c(2,6,8,4,5)] <- 0
      

      【讨论】:

      • 我认为你不需要第二个矩阵调用 m[m &lt; vec]&lt;-0 应该这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2021-10-13
      • 2021-02-19
      • 1970-01-01
      • 2019-11-30
      • 2022-12-03
      • 2015-04-23
      相关资源
      最近更新 更多