Суммирование множества векторов; построчно или поэлементно, но игнорируя значения NA

Я пытаюсь создать новый вектор, который представляет собой сумму 35 других векторов. Проблема в том, что существует множество значений NA, но для этого конкретного использования я хочу рассматривать их как нули. Сложение векторов не сработает, потому что если какой-либо из 35 векторов содержит NA, результатом будет NA. Вот пример проблемы:

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

Я хочу, чтобы результат был 1, 3, 7, 6.
Я полагаю, что мог бы создать новые версии каждого из векторов, в которых я заменю NA на 0, но это было бы много работы применительно к 35 векторов. Есть ли простая функция, которая поможет мне?


person user2980491    schedule 20.11.2013    source источник


Ответы (2)


Также можно было бы использовать функцию rowSums:

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

?rowSums   # also has colSums described on same help page
person IRTFM    schedule 20.11.2013
comment
Хороший! Таким образом, мне не нужно сообщать Apply, что функция применяется к строке. - person user2980491; 21.11.2013
comment
Это также намного быстрее, если используется с большими данными. - person IRTFM; 21.11.2013

Сначала поместите их в матрицу:

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

Вы можете прочитать о каждой функции здесь, используя встроенную документацию R: ?apply, ?cbind.

cbind означает «привязка столбца»: он берет несколько векторов или массивов и связывает их «по столбцу» в один массив:

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

apply, ну, применяет функцию (в данном случае sum) либо к строкам, либо к столбцам матрицы. Это позволяет нам использовать аргумент na.rm = TRUE для sum, чтобы значения NA отбрасывались.

person joran    schedule 20.11.2013
comment
Это работает! Кажется, я задал довольно простой вопрос, но если бы вы могли добавить ссылку или две, которые помогут объяснить, почему этот код работает, я был бы признателен. - person user2980491; 20.11.2013
comment
Что представляет собой 1 в приложении? Я имею в виду 1, которая появляется между списком столбцов и функцией суммы. - person user2980491; 20.11.2013
comment
Ага! Строки, а не столбцы. (Кстати, я пытался прочитать эту статью, прежде чем спрашивать, но у меня возникли проблемы с ее пониманием) - person user2980491; 21.11.2013