2017-04-26 31 views
5

Bir matrisin her satırına bir fonksiyon uygulamak istediğimi varsayalım. Fonksiyonun argümanlarından biri bir vektör alır.R: Fonksiyonu argüman olarak vektörün elemanlarıyla matrise uygula.

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

var2 <- c(1:10) 

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

bu çalıştı ben:

apply(df, 1, function(x) MYFUNC(x, Var=var2)) 
ben ilk satırda, ikinci sıraya ikinci eleman vb Örneğin

için vektör ilk elemanını uygulamak istiyorum

Ancak bu bana her bir satır & Var kombinasyonuna uygulanan işlevi ile 10x10 matris verir, oysa ben sadece köşegen elemanlarla ilgileniyorum. Ayrıca mapply işlevine de baktım, ancak bu durumda nasıl uygulanacağından emin değilim.

Herhangi bir yardım gerçekten takdir edilecektir.

cevap

5

Mapply ile vectorized edilebilir kesinlikle bir olasılık. Bu çalışması gerekir:

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 

konu seni içine yayınlanırken düşünüyorum mapply vektörleri veya listeleri ya almasıdır. R matrislerinde liste yok, ancak data.frame s var. Tek yapmanız gereken, matrisinizi dönüştürmek ve data.frame'a dönüştürmektir ve daha sonra mapply çalışmalıdır. data.frame'daki her sütun, listedeki bir öğedir ve bu nedenle, onu dönüştürmemiz gerektiğidir (böylece, her bir row, vektördeki her öğeye eşlenecektir).

2

, satır dizisi boyunca, biz döngü, matris/vektöründe mukabil satır ve elemanları olması veri alt kümesi ve için işlev

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 

uygulamalıdır iki parametre vardır şöyle spesifik bir örnek, bu 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 
İlgili konular