我正在执行一项普通 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上。
答案 0 :(得分:2)
通过复制每个'x'元素,使'x'与'a / b'的长度相同,我们可以使用ifelse
。 col
是一个方便的功能。
c <- a
c[] <- ifelse(x[col(a)]==-1, a, b)
或者与上一步一样,我们创建一个逻辑向量(x==1
),使用+
强制转换为二进制,使长度与'a'相同,指定ncol
在matrix
。
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