应用 - 通过组合另外两个矩阵创建矩阵,使用向量中的值来选择要从中组合的列

时间:2015-10-17 12:32:15

标签: r

我正在执行一项普通 for 循环的任务。我认为它可以通过 apply 函数之一完成,但无法找到方法。如果可以将 apply 应用于问题或者是否有更有效的方法来解决问题,请问你能不能? 我知道我可以制作udf和 do.call(),但我认为它与循环相同。

问题: 我有两个矩阵a和b,两个(m x n)和一个长度为n的向量。我想创建第三个矩阵(m x n),它将根据向量的值从a或b中接收列。

例如:

a=  
[0, 0, 0, 0]  
[0, 0, 0, 0]  
[0, 0, 0, 0]  
[0, 0, 0, 0] 



b=  
[1, 1, 1, 1]  
[1, 1, 1, 1]  
[1, 1, 1, 1]  
[1, 1, 1, 1] 



x=  
[-1, -1, 1, 1]

如果x [k]为-1,则c从a中接收列,如果x [k]为1,则c从b接收列,产生:

c=  
[0, 0, 1, 0]  
[0, 0, 1, 0]  
[0, 0, 1, 0]  
[0, 0, 1, 0] 

可重复的例子:

a <- matrix(rep(0, 16), nrow = 4, ncol = 4)
b <- matrix(rep(1, 16), nrow = 4, ncol = 4)
x <- c(-1,-1, 1,-1)
c <- matrix(NA, nrow = 4, ncol = 4)
for (i in 1:length(x)){
  if (x[[i]] < 0){
    c[,i] <- a[,i]
  } else {
    c[,i] <- b[,i]
  }
}

有没有更有效的解决方案?

的问候,
P上。

1 个答案:

答案 0 :(得分:2)

通过复制每个'x'元素,使'x'与'a / b'的长度相同,我们可以使用ifelsecol是一个方便的功能。

 c <- a
 c[] <- ifelse(x[col(a)]==-1, a, b)

或者与上一步一样,我们创建一个逻辑向量(x==1),使用+强制转换为二进制,使长度与'a'相同,指定ncolmatrix

 matrix(+(x==1)[col(a)], ncol=ncol(a))
 #      [,1] [,2] [,3] [,4]
 #[1,]    0    0    1    0
 #[2,]    0    0    1    0
 #[3,]    0    0    1    0
 #[4,]    0    0    1    0