web-dev-qa-db-fra.com

Moyenne des colonnes de R, à l'exclusion des AN

Je ne peux pas imaginer que je suis la première personne à poser cette question, mais je n'ai pas encore trouvé de solution (ici ou ailleurs).

J'ai quelques colonnes, que je veux faire la moyenne en R. Le seul aspect minimalement délicat est que certaines colonnes contiennent des NA.

Par exemple:

Trait Col1 Col2 Col3
DF    23   NA   23
DG    2    2    2
DH    NA   9    9

Je veux créer un Col4 qui fait la moyenne des entrées dans les 3 premières colonnes, en ignorant les NA. Donc:

 Trait Col1 Col2 Col3 Col4
 DF    23   NA   23   23
 DG    2    2    2    2
 DH    NA   9    9    9 

Idéalement, quelque chose comme ça fonctionnerait:

data$Col4 <- mean(data$Chr1, data$Chr2, data$Chr3, na.rm=TRUE)

mais ce n'est pas le cas.

18
mfk534

Vous voulez rowMeans() mais notez surtout qu'il a un na.rm argument que vous souhaitez définir sur TRUE. Par exemple.:

> mat <- matrix(c(23,2,NA,NA,2,9,23,2,9), ncol = 3)
> mat
     [,1] [,2] [,3]
[1,]   23   NA   23
[2,]    2    2    2
[3,]   NA    9    9
> rowMeans(mat)
[1] NA  2 NA
> rowMeans(mat, na.rm = TRUE)
[1] 23  2  9

Pour correspondre à votre exemple:

> dat <- data.frame(Trait = c("DF","DG","DH"), mat)
> names(dat) <- c("Trait", paste0("Col", 1:3))
> dat
  Trait Col1 Col2 Col3
1    DF   23   NA   23
2    DG    2    2    2
3    DH   NA    9    9
> dat <- transform(dat, Col4 = rowMeans(dat[,-1], na.rm = TRUE))
> dat
  Trait Col1 Col2 Col3 Col4
1    DF   23   NA   23   23
2    DG    2    2    2    2
3    DH   NA    9    9    9
27
Gavin Simpson