sum_
из hablar
ведут себя так же, как хотел OP.Таким образом, нет необходимости заново изобретать колесо
library(hablar)
sum_(c(1:10, NA))
#[1] 55
sum_(c(NA, NA, NA))
#[1] NA
, и его можно использовать в tidyverse
или data.table
library(dplyr)
df1 %>%
summarise_all(sum_)
Но, если нам нужно изменитьПользовательская функция OP, вместо ifelse
, лучший вариант: if/else
sumna <- function(x) {
if(all(is.na(x))) NA else sum(x, na.rm = TRUE)
}
Также мы можем использовать векторизованный colSums
v1 <- colSums(df1, na.rm = TRUE)
v1[colSums(is.na(df1)) == nrow(df1)] <- NA
Поскольку набор данных огромен, мы также можем использовать эффективные data.table
library(data.table)
setDT(df1)[, lapply(.SD, sumna)]
или используя tidyverse
library(tidyverse)
df1 %>%
summarise_all(sumna)