2017-04-26 94 views
5

假設我想將函數應用於矩陣的每一行。函數的一個參數需要一個向量。我想向量的第一元件施加到第一行,所述第二元件到第二行,等等R:將函數應用於以向量元素爲參數的矩陣

例如:

set.seed(123) 
df<-matrix(runif(100), ncol=10) 

var2 <- c(1:10) 

MYFUNC <- function(x, Var=NA){ 
    sum(x)/Var 
} 

我嘗試這樣做:

apply(df, 1, function(x) MYFUNC(x, Var=var2)) 

但是,這給了我一個10x10矩陣與該功能應用於每行& Var組合,而我只對對角元素感興趣。我也研究了mapply函數,但我不確定如何在這種情況下應用它。

任何幫助將非常感激。

回答

5

Mapply被矢量肯定是可能的。這應該工作:

mapply(MYFUNC, x = as.data.frame(t(df)), Var = var2) 

#V1  V2  V3  V4  V5  V6  V7  V8  V9  V10 
#5.0795111 2.8693537 1.8285747 1.3640238 0.8300597 0.6280441 0.7706310 0.6720132 0.5719003 0.4259674 

的問題,我認爲你正在運行到的是,mapply或者取向量或列表。在R矩陣中不是列表,但data.frame是。所有你需要做的是轉置你的矩陣,並轉換爲data.frame,然後mapply應該工作。 data.frame中的每一列都是列表中的一個元素,這就是爲什麼我們必須對其進行轉置(以便每個row將映射到向量中的每個元素)。

2

由於有兩個參數,應該在基質/載體中的相應的行和元件分別,我們可以通過行的序列循環,子集中的數據和應用功能

sapply(seq_len(nrow(df)), function(i) MYFUNC(df[i,], Var = var2[i])) 
#[1] 5.0795111 2.8693537 1.8285747 1.3640238 0.8300597 0.6280441 
#[7] 0.7706310 0.6720132 0.5719003 0.4259674 

對於具體例子中,它可以與rowSums

rowSums(df)/var2 
#[1] 5.0795111 2.8693537 1.8285747 1.3640238 0.8300597 0.6280441 
#[7] 0.7706310 0.6720132 0.5719003 0.4259674