【问题标题】:Use ifelse to extract information from a matrix使用 ifelse 从矩阵中提取信息
【发布时间】:2018-01-13 08:02:30
【问题描述】:

我正在尝试从表中提取一些信息,并且我正在尝试避免任何 for 循环或 apply 类型的函数。

假设一个向量 m

 m=c(1:20)  
 m
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

还有一个矩阵g

x1=c(0,1,0,1,2,0,1,2,3,0,1,2,3,4,0,1,2,3,4,5)   
x2=c(1,0,2,1,0,3,2,1,0,4,3,2,1,0,5,4,3,2,1,0)  
u=.4*x1^.5+.6*x2^.5  
g=cbind(x1,x2,u)  
 g
      x1 x2         u  
 [1,]  0  1 0.6000000  
 [2,]  1  0 0.4000000  
 [3,]  0  2 0.8485281  
 [4,]  1  1 1.0000000    
 [5,]  2  0 0.5656854  
 [6,]  0  3 1.0392305  
 [7,]  1  2 1.2485281  
 [8,]  2  1 1.1656854  
 [9,]  3  0 0.6928203  
[10,]  0  4 1.2000000  
[11,]  1  3 1.4392305  
[12,]  2  2 1.4142136  
[13,]  3  1 1.2928203  
[14,]  4  0 0.8000000  
[15,]  0  5 1.3416408  
[16,]  1  4 1.6000000  
[17,]  2  3 1.6049159  
[18,]  3  2 1.5413485  
[19,]  4  1 1.4000000  
[20,]  5  0 0.8944272  

我想为 m 的每个元素检查总和 g[,1]+g[,2] 是否等于该元素。对于条件为 TRUE 的所有情况,我希望我的代码返回具有最高 g[,3] 值的位置。 例如,当 m=5 时,条件 x[,1]+x[,2]==5 在 15、16、17、18、19 和 20 处为 TRUE。在这 6 个中,条目 17 具有最高值,所以我希望我的代码返回值 17。

所以最后,我期望一个长度=长度(m)的向量,它将指示 m 的每个元素,其中 g[,3] 的最大值满足上述条件。向量应该是这样的:

1,4,7,11,17,0,0,0,0,0,0...,0

当m=1时,g[,1]+g[,2]==1所在的行为第1行 当 m=2 时,g[,1]+g[,2]==2 的行是第 4 行,以此类推。

目前我在g的每一行都使用apply,但是这个过程重复了数千次,而且我的代码很慢。为了加快速度,我求助于 ifelse 以努力以矢量化的方式做事。

我想要做的是:

ifelse(m>0,which(g[,3]==max(g[which(g[,1]+g[,2]==m),3])),0)

当我运行这个时,我得到了

 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

如果我用 5 代替 m,它会返回一个 17s 的向量。 它似乎只使用 m 的第一个元素而不是整个向量。 任何关于我如何完成这项工作的建议,或者可以做同样工作的替代方案都非常受欢迎。

【问题讨论】:

  • 你能显示预期的输出吗?试试which(outer(m, g[,1]+g[,2], '=='), arr.ind = TRUE) 或者可能是g[,3][max.col(outer(m, g[,1]+g[,2], '=='))]
  • 谢谢。我编辑了问题以包含预期的输出。

标签: r if-statement matrix vectorization


【解决方案1】:

我们可以使用outermax.col

m1 <- t(outer( g[,1] + g[,2], m,  `==`)* g[,3])
max.col(m1) * (rowSums(m1!= 0) !=0)
#[1]  1  4  7 11 17  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 2017-11-26
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多