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

Существует pmin и pmax, каждый из которых принимает na.rm, почему нет psum?

Кажется, что R может отсутствовать очевидная простая функция: psum. Он существует как другое имя или находится в пакете где-то?

x = c(1,3,NA,5)
y = c(2,NA,4,1)

min(x,y,na.rm=TRUE)    # ok
[1] 1
max(x,y,na.rm=TRUE)    # ok
[1] 5
sum(x,y,na.rm=TRUE)    # ok
[1] 16

pmin(x,y,na.rm=TRUE)   # ok
[1] 1 3 4 1
pmax(x,y,na.rm=TRUE)   # ok
[1] 2 3 4 5
psum(x,y,na.rm=TRUE)
[1] 3 3 4 6                             # expected result
Error: could not find function "psum"   # actual result

Я понимаю, что + уже похож на psum, но как насчет NA?

x+y                      
[1]  3 NA NA  6        # can't supply `na.rm=TRUE` to `+`

Есть ли случай для добавления psum? Или я что-то пропустил.

Этот вопрос является продолжением этого вопроса:
Используя := в data.table, чтобы суммировать значения двух столбцов в R, игнорируя NAs

4b9b3361

Ответ 1

Следуя комментарию @JoshUlrich по предыдущему вопросу,

psum <- function(...,na.rm=FALSE) { 
    rowSums(do.call(cbind,list(...)),na.rm=na.rm) } 

изменить: от Свена Хоэнштейна:

psum2 <- function(...,na.rm=FALSE) { 
    dat <- do.call(cbind,list(...))
    res <- rowSums(dat, na.rm=na.rm) 
    idx_na <- !rowSums(!is.na(dat))
    res[idx_na] <- NA
    res 
}

x = c(1,3,NA,5,NA)
y = c(2,NA,4,1,NA)
z = c(1,2,3,4,NA)

psum(x,y,na.rm=TRUE)
## [1] 3 3 4 6 0
psum2(x,y,na.rm=TRUE)
## [1] 3 3 4 6 NA

n = 1e7
x = sample(c(1:10,NA),n,replace=TRUE)
y = sample(c(1:10,NA),n,replace=TRUE)
z = sample(c(1:10,NA),n,replace=TRUE)

library(rbenchmark)
benchmark(psum(x,y,z,na.rm=TRUE),
          psum2(x,y,z,na.rm=TRUE),
          pmin(x,y,z,na.rm=TRUE), 
          pmax(x,y,z,na.rm=TRUE), replications=20)

##                          test replications elapsed relative 
## 4  pmax(x, y, z, na.rm = TRUE)           20  26.114    1.019 
## 3  pmin(x, y, z, na.rm = TRUE)           20  25.632    1.000 
## 2 psum2(x, y, z, na.rm = TRUE)           20 164.476    6.417
## 1  psum(x, y, z, na.rm = TRUE)           20  63.719    2.486

Версия Sven (которая, возможно, является правильной) довольно немного медленнее, хотя независимо от того, имеет ли он значение, это зависит от приложения. Кто-нибудь хочет взломать встроенную/Rcpp-версию?

Что касается того, почему этого не существует: не знаю, но удачи, получая R-core, чтобы сделать такие дополнения... Я не могу заранее подумать о достаточно распространенном пакете *misc, в который это могло бы идти...

Последующая тема от Matthew на r-devel находится здесь (что, кажется, подтверждает):
r-devel: есть pmin и pmax, каждый из которых принимает na.rm, как насчет psum?