【问题标题】:Apply - creating a matrix by combining two other matrices, using value from a vector to select the one to combine column from应用 - 通过组合其他两个矩阵来创建矩阵,使用向量中的值来选择要组合的列
【发布时间】:2015-10-17 12:32:15
【问题描述】:

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

问题: 我有两个矩阵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.

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以在通过复制每个“x”元素使“x”与“a/b”长度相同后使用ifelsecol 是一个方便的函数。

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

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

     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
    

    【讨论】:

    • 工作!非常感谢阿克伦。
    • 一如既往,您的解决方案非常出色和优雅!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多