Если у нас есть несколько столбцов и мы хотим суммировать только ограниченные столбцы, мы можем заменить их на 0, а затем добавить столбцы
library(dplyr)
chk1 %>%
mutate_at(vars(ba_mat_x,ba_mat_y), ~ replace(., is.na(.), 0)) %>%
mutate(ba_mat = ba_mat_x + ba_mat_y)
# ba_mat_x ba_mat_y ba_mat
#1 1 0 1
#2 2 2 4
#3 3 0 3
#4 4 5 9
Мы также можем использовать replace_na
из tidyr
, что делает то же самое.
chk1 %>%
mutate_at(vars(ba_mat_x, ba_mat_y), tidyr::replace_na, 0) %>%
mutate(ba_mat = ba_mat_x + ba_mat_y)
Если мы хотим использовать sum
, другой вариант - использовать purrr
'pmap
или pmap_dbl
, где мы можем теперь передать список столбцов для добавления, а затем использовать sum
.
chk1 %>%
mutate(ba_mat = purrr::pmap_dbl(list(ba_mat_x, ba_mat_y), sum, na.rm = TRUE))
# ba_mat_x ba_mat_y ba_mat
#1 1 NA 1
#2 2 2 4
#3 3 NA 3
#4 4 5 9
В данном конкретном случае мы также можем использовать map2_dbl
chk1 %>%
mutate(ba_mat = purrr::map2_dbl(ba_mat_x, ba_mat_y, sum, na.rm = TRUE))
Это также будет работать, так как у нас есть только два столбца, но в случае, если есть больше столбцов, лучше / безопаснее использовать параметр pmap
.
Более того, что касается вашей попытки, она сработает, если вы добавите к ней rowwise
. rowwise
, как следует из названия, выполняет все операции построчно.
chk1 %>%
rowwise() %>%
mutate(ba_mat = sum(ba_mat_x, ba_mat_y, na.rm = T))
Но rowwise
обычно медленнее.