如何同时对两个变量使用apply

时间:2014-03-13 15:50:05

标签: r

假设我有

# test case
a<-matrix(rep(c(1,2,3,4,5,6),3),ncol=3)
b<-t(matrix(c(1,3,4)))

a

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    3    3
[4,]    4    4    4
[5,]    5    5    5
[6,]    6    6    6

b

     [,1] [,2] [,3]
[1,]    1    3    4

b&#34;的每个元素对应&#34;到a列,并在函数中需要如下:

我有一个函数myFun

myfun<-function(x,n) {
   x[1:n]<-NA
   x
}

我想用它来返回

t<-cbind(myfun(a[,1],b[1]), myfun(a[,2],b[2]), myfun(a[,3],b[3]))

t
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]    2   NA   NA
[3,]    3   NA   NA
[4,]    4    4   NA
[5,]    5    5    5
[6,]    6    6    6

如何在不使用apply循环的情况下使用lapply / sapply / for来实现上述目标?

例如,我尝试apply(a,2,FUN=myfun,b),然后将整个b传递给myfun而不是b[1]b[2]等。

如何重写apply(a,2,FUN=myfun,b)myfun只会选取与b相应列相对应的a元素?

1 个答案:

答案 0 :(得分:1)

您可以使用向量子集来完成此任务:

(NAcells <- unlist(sapply(seq_along(b), function(i) seq(b[i])+(i-1)*nrow(a))))
[1]  1  7  8  9 13 14 15 16

a[NAcells] <- NA
a
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]    2   NA   NA
[3,]    3   NA   NA
[4,]    4    4   NA
[5,]    5    5    5
[6,]    6    6    6