在R中,如何用另一个向量的值替换矩阵中满足特定条件的值?

3

I have a matrix and a vector like this:

Matrix<-cbind(c(3,3,5,1),c(2,5,2,1))
Vector<-c(2,3,3,3)

我希望用向量的值替换矩阵中大于等于对应向量值的元素,使得矩阵现在看起来像这样:

MatrixNew<-cbind(c(2,3,3,1),c(2,3,2,1))

什么逻辑可以实现这个?
3个回答

4

你可能认为必须使用apply(Matrix, \(x) pmin(x, Vector)),但实际上,你可以直接在Matrix上使用pmin(),因为它会循环使用Vector以匹配长度。

pmin(Matrix, Vector)
#>      [,1] [,2]
#> [1,]    2    2
#> [2,]    3    3
#> [3,]    3    2
#> [4,]    1    1

好的解决方案,非常感谢! - locket
1
干得好,优雅高效!点赞了! - ThomasIsCoding

2
我认为 @caldwellst 提供的 pmin 方法 是目前最简单的方法。这里还有另一种选项,使用 ifelse
> ifelse(Matrix >= Vector, Vector, Matrix)
     [,1] [,2]
[1,]    2    2
[2,]    3    3
[3,]    3    2
[4,]    1    1

1

使用dplyr::mutate也可以实现这一功能。在需要选择变量子集的情况下非常有用。

library(dplyr)        
dd = structure(list(V1 = c(3, 3, 5, 1), ` V2` = c(2, 5, 2, 1), Condition = c(2, 
                3, 3, 3)), class = "data.frame", row.names = c(NA, -4L))
dd %>% mutate(across(contains('V'), ~ifelse(.>=Condition, Condition,. )))
      V1  V2 Condition
    # 1  2   2         2
    # 2  3   3         3
    # 3  3   2         3
    # 4  1   1         3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接