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.
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