我正在尝试从表中提取一些信息,并且我正在尝试避免任何 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。
所以最后,我希望有一个 length=length(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 的第一个元素而不是整个向量。 非常欢迎任何关于我如何完成这项工作的建议,或者可以完成相同工作的替代方案。
最佳答案
我们可以使用 outer
和 max.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
关于r - 使用 ifelse 从矩阵中提取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45522773/