Ответ 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?