Подтвердить что ты не робот

Среднее значение по столбцам в R, за исключением NA

Я не могу себе представить, что я первый человек с этим вопросом, но я еще не нашел решение (здесь или где-то еще).

У меня есть несколько столбцов, которые я хочу усреднить в R. Единственный минимально сложный аспект заключается в том, что в некоторых столбцах содержатся NA.

Например:

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

Я хочу создать Col4, который усредняет записи в первых трех столбцах, игнорируя NA. Итак:

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

В идеале что-то вроде этого будет работать:

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

но это не так.

4b9b3361

Ответ 1

Вы хотите rowMeans(), но важно отметить, что у него есть аргумент na.rm, который вы хотите установить на TRUE. Например:.

> 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

В соответствии с вашим примером:

> 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