假设我有
# 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
元素?
答案 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