Поэлементное среднее в R

В R у меня есть два вектора:

a <- c(1, 2, 3, 4)
b <- c(NA, 6, 7, 8)

Как мне найти поэлементное среднее двух векторов, удалив NA, без цикла? т.е. я хочу получить вектор

(1, 4, 5, 6)

Я знаю функцию mean(), я знаю аргумент na.rm = 1. Но я не знаю, как все сложить. Конечно, на самом деле у меня есть тысячи векторов с NA, появляющиеся в разных местах, поэтому любое решение, зависящее от размерности, не сработает. Спасибо.


person Zhang18    schedule 16.08.2010    source источник


Ответы (3)


как насчет:

rowMeans(cbind(a, b), na.rm=TRUE)

or

colMeans(rbind(a, b), na.rm=TRUE)
person Greg    schedule 16.08.2010
comment
Хорошо, это круто. Но чтобы получить то, что я хотел, вам все равно нужно добавить na.rm = 1, и это решает мою проблему. Спасибо. - person Zhang18; 17.08.2010
comment
Я просто добавил аргументы na.rm. - person Greg; 17.08.2010
comment
colSums и rowSums также существуют @ Zhang18, к сведению. - person Vince; 17.08.2010
comment
Обобщение этого на массивы более высоких измерений выглядит примерно так: apply(abind(a, b, along=0), c(2,3,4), mean, na.rm=TRUE) (если a и b для начала трехмерны). - person naught101; 24.08.2012

Я не совсем уверен, что вы просите, но

apply(rbind(a,b),2,mean,na.rm = TRUE)

делай что хочешь?

person deinst    schedule 16.08.2010
comment
В разделе «Подробности»? ColMeans и? RowMeans объясняется, что эти функции намного быстрее, чем применение с fun = mean, поскольку они реализованы для скорости. - person Greg; 17.08.2010

tidyverse Решение используется purrr:

library(purrr)
a <- c(1, 2, 3, 4)
b <- c(NA, 6, 7, 8)

# expected:
c(1, 4, 5, 6) 
#> [1] 1 4 5 6

# actual:
map2_dbl(a,b, ~mean(c(.x,.y), na.rm=T)) # actual
#> [1] 1 4 5 6

И для любого количества векторов:

>  pmap_dbl(list(a,b, a, b), compose(partial(mean, na.rm = T), c))
 [1] 1 4 5 6
person shosaco    schedule 14.10.2019