2011-06-05 5 views
1

Y a-t-il une version de Vectorize qui utilise apply plutôt que mapply? Je voudrais vectoriser une fonction qui prend l'entrée vectorielle d'une manière qui me permet de passer un tableau à cette fonction et d'avoir un vecteur retourné.Une version de Vectorize() pour apply() plutôt que mapply()?

Bien sûr, je peux écrire mon propre emballage et cela fonctionne assez bien. Mais je me demandais si cette fonctionnalité est intégrée?

Je peux également utiliser Vectorize, mais ensuite je dois convertir l'entrée de la matrice à un data.frame pour son travail. Par exemple:

LAMBDA <- cbind(c(1, .5, .5), c(.5, 1, .5), c(.5, .5, 1)) 
THETA <- c(0,0,1) 
NU <- 21 
my.data <- array(1:6, c(3,2)) 
my.fun <- Vectorize(pmt, vectorize.args="x") 

Puis

> my.fun(my.data, mean=THETA, S=LAMBDA, df=NU) 
[1] 0.4404142 0.8130572 0.9667065 0.9961166 0.9996274 0.9999676 

Ce qui est pas ce que je veux, mais

> my.data <- data.frame(my.data) 
> my.fun(my.data, mean=THETA, S=LAMBDA, df=NU) 
     X1  X2 
0.8130572 0.9996274 

est ce que je veux.

BTW, pmt provient du package mnormt et est un t cdf d'étudiant multivarié.

Répondre

1

Il semble que vous voulez définir une fonction my.fun à laquelle vous passez dans une matrice my.data et le my.fun va juste « savoir » qu'il doit appliquer la fonction à chaque colonne de my.data. C'est ce que la fonction apply() est censée faire; vous n'avez pas besoin de l'appel Vectorize. Alors pourquoi ne pas le faire:

my.data <- array(1:6, c(3,2)) 

> apply(my.data, 2, pmt, mean=THETA, S=LAMBDA, df=NU) 

[1] 0.8130572 0.9996274 
+0

Voulez-vous dire que my.data' peut être un vecteur au lieu d'une matrice? Si oui, pouvez-vous en faire une matrice à une seule colonne? – Aaron

+0

Si oui, tout ce dont vous avez besoin est 'apply (matrice (my.data, nrow = 3), 2, pmt, moyenne = THETA, S = LAMBDA, df = NU)'. Cela fonctionne à la fois sur les vecteurs et les matrices. – Aaron

+0

@ La solution d'Aaron est meilleure que ma solution si sinon, au moins en termes de lisibilité. Je suppose que 'Vectorize' fait quelque chose de similaire dans' args <- lapply (as.list (match.call()) [- 1L], eval, parent.frame()) '. Pas que je le comprenne complètement. – kalu

Questions connexes