web-dev-qa-db-fra.com

Résumer beaucoup de vecteurs; rangée ou élément élément, mais ignorer les valeurs na

J'essaie de créer un nouveau vecteur qui est la somme de 35 autres vecteurs. Le problème est qu'il y a beaucoup de valeurs NA, mais pour cette utilisation particulière, je veux traiter ceux comme des zéros. L'ajout de vecteurs ne fonctionnera pas, car si l'un des 35 vecteurs contient un Na, le résultat est Na. Voici l'exemple du problème:

col1<-c(NA,1,2,3)
col2<-c(1,2,3,NA)
col3<-c(NA,NA,2,3)
Sum<-col1+col2+col3
Sum
# [1] NA NA  7 NA

Je veux que le résultat soit 1, 3, 7, 6.
[.____] Je suppose que je pourrais créer de nouvelles versions de chacun des vecteurs dans lesquels je remplace le Na avec un 0, mais ce serait beaucoup de travail lorsqu'il est appliqué à 35 vecteurs. Y a-t-il une seule fonction qui m'aidera?

18
user2980491

Aurait également pu utiliser la fonction rowSums:

rowSums( cbind (col1,col2,col3), na.rm=TRUE)
#[1] 1 3 7 6

?rowSums   # also has colSums described on same help page
32
42-

Mettez-les dans une matrice en premier:

apply(cbind(col1,col2,col3),1,sum,na.rm = TRUE)
[1] 1 3 7 6

Vous pouvez lire sur chaque fonction ici utilisant la documentation intégrée de R: ?apply, ?cbind.

cbind signifie "Colonne Bind": il prend plusieurs vecteurs ou tableaux et les lie "par colonne" dans un seul tableau:

cbind(col1,col2,col3)
     col1 col2 col3
[1,]   NA    1   NA
[2,]    1    2   NA
[3,]    2    3    2
[4,]    3   NA    3

apply, eh bien, s'applique une fonction (sum dans ce cas) aux lignes ou aux colonnes d'une matrice. Cela nous permet d'utiliser le na.rm = TRUE argument à sum afin que les valeurs NA soient supprimées.

7
joran