Supposons que j'ai une matrice par 2 et une fonction qui prend un vecteur 2 comme l'un de ses arguments. Je voudrais appliquer la fonction à chaque ligne de la matrice et obtenir un vecteur n. Comment faire cela en R?
Par exemple, je voudrais calculer la densité d'une distribution normale standard 2D sur trois points:
bivariate.density(x = c(0, 0), mu = c(0, 0), sigma = c(1, 1), rho = 0){
exp(-1/(2*(1-rho^2))*(x[1]^2/sigma[1]^2+x[2]^2/sigma[2]^2-2*rho*x[1]*x[2]/(sigma[1]*sigma[2]))) * 1/(2*pi*sigma[1]*sigma[2]*sqrt(1-rho^2))
}
out <- rbind(c(1, 2), c(3, 4), c(5, 6))
Comment appliquer la fonction à chaque ligne de out
?
Comment passer des valeurs pour les autres arguments en plus des points à la fonction de la manière que vous spécifiez?
apply()
- il balaie par ligne (lorsque le second argument est 1, sinon par colonne), et la ligne courante (ou col) est toujours le premier argument. C'est ainsi que les choses sont définies.MARGIN
argument. Ici, cela signifie appliquer la fonction aux lignes (la première dimension dansdim(M)
). Si c'était 2, il appliquerait la fonction aux colonnes.Si vous souhaitez appliquer des fonctions courantes telles que la somme ou la moyenne, vous devez utiliser
rowSums
ourowMeans
car elles sont plus rapides que l'apply(data, 1, sum)
approche. Sinon, restez avecapply(data, 1, fun)
. Vous pouvez passer des arguments supplémentaires après l'argument FUN (comme Dirk déjà suggéré):Ensuite, vous pouvez faire quelque chose comme ceci:
la source
Voici un court exemple d'application d'une fonction à chaque ligne d'une matrice. (Ici, la fonction appliquée normalise chaque ligne à 1.)
Remarque: Le résultat de la
apply()
a dû être transposé en utilisantt()
pour obtenir la même disposition que la matrice d'entréeA
.Résultat:
la source
La première étape serait de créer l'objet de fonction, puis de l'appliquer. Si vous voulez un objet matrice qui a le même nombre de lignes, vous pouvez le prédéfinir et utiliser la forme object [] comme illustré (sinon la valeur retournée sera simplifiée en vecteur):
Si vous souhaitez utiliser d'autres paramètres que vos paramètres par défaut, l'appel doit inclure des arguments nommés après la fonction:
apply () peut également être utilisé sur des tableaux de dimensions supérieures et l'argument MARGIN peut être un vecteur ainsi qu'un seul entier.
la source
Postuler fait bien le travail, mais est assez lent. Utiliser sapply et vapply pourrait être utile. rowwise de dplyr pourrait également être utile Voyons un exemple de la façon de produire un produit ligne par ligne de n'importe quelle trame de données.
Notez que l'assignation à une variable avant d'utiliser vapply / sapply / apply est une bonne pratique car elle réduit beaucoup le temps. Voyons les résultats de microbenchmark
Regardez attentivement comment t () est utilisé
la source
b <- t(iris[1:10, 1:3])
etapply(b, 2 prod)
.Une autre approche si vous souhaitez utiliser une partie variable de l'ensemble de données au lieu d'une seule valeur consiste à utiliser
rollapply(data, width, FUN, ...)
. L'utilisation d'un vecteur de largeurs vous permet d'appliquer une fonction sur une fenêtre variable de l'ensemble de données. J'ai utilisé cela pour créer une routine de filtrage adaptatif, même si ce n'est pas très efficace.la source