基于R中阈值向量的矩阵操作

时间:2013-06-28 16:41:14

标签: r loops matrix matrix-indexing

我有一个数字矩阵如下

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

有没有办法在没有通过循环实际编码的情况下执行此操作?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

是的,你可以:

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