2014-03-13 42 views
1

假設我有我該如何使用適用於兩個變量同時

# 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「對應」,以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

+2

嘗試'mapply'或'Map' – Metrics

+0

謝謝'mapply'解決我的問題,就是我一直在尋找。如果可以將您的評論重寫爲答案,我可以選擇它作爲SO中的答案。 – uday

+0

這很好。您可以將其作爲答案發布。 – Metrics

回答

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 
+0

非常酷的解決方案!非常感謝。 – uday

+0

它被分解的唯一地方是如果b的任何元素爲零。 – uday

相關問題