【发布时间】: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