有pmin和pmax分别取na.rm,为什么没有psum?

有pmin和pmax分别取na.rm,为什么没有psum?,r,R,看起来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]

看起来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
?或者我错过了什么

此问题是此问题的后续问题:

继@JoshUlrich对上一个问题的评论之后

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

psum另一种方法的优点是也可以处理矩阵,就像
pmin
pmax
一样

psum[1]3 3 4 6
#用矩阵
A[1,]NA 8 14
#> [2,]    4   10   16
#>[3,]6 12 NA
psum(A、B、na.rm=TRUE)
#>      [,1] [,2] [,3]
#> [1,]    1    8   14
#> [2,]    4   10   16
#> [3,]    6   12    9
由(v0.3.0)于2020-03-09创建

一个警告:如果一个元素在所有求和对象中都是
NA
,并且
NA.rm=TRUE
,则结果将是
0
(而不是
NA

例如:

psum(NA,NA,NA.rm=TRUE)
#> [1] 0

在CRAN上快速搜索后,至少有3个软件包具有
psum
功能
rccmisc
incadata
kit
<代码>套件
似乎是最快的。下面是本·博尔克的例子

benchmark(
  rccmisc::psum(x,y,z,na.rm=TRUE),
  incadata::psum(x,y,z,na.rm=TRUE),
  kit::psum(x,y,z,na.rm=TRUE), 
  psum(x,y,z,na.rm=TRUE),
  psum2(x,y,z,na.rm=TRUE),
  replications=20
)
#                                    test replications elapsed relative
# 2 incadata::psum(x, y, z, na.rm = TRUE)           20   20.05   14.220
# 3      kit::psum(x, y, z, na.rm = TRUE)           20    1.41    1.000
# 4           psum(x, y, z, na.rm = TRUE)           20    8.04    5.702
# 5          psum2(x, y, z, na.rm = TRUE)           20   20.44   14.496
# 1  rccmisc::psum(x, y, z, na.rm = TRUE)           20   23.24   16.482

启动倒计时计时器直到我们在r-devel上看到贡献的补丁:10、9、8、7、@DirkEddelbuettel:计时器过期了吗?@DirkEddelbuettel现在怎么样?一个答案可能是
函数(…){rowSums(cbind(…),na.rm=TRUE)}
?任何适当维度的向量或数据帧的混合都应该成功。当NA.rm=TRUE时,NA为零,但
sum
也为零。仍然没有数据。表::psum从1.9版开始。6@DirkEddelbuettel仍然没有?这些不会返回所需的结果。它们删除
NA
。所需的结果是长度为4的向量:
3 4 6
。而不是
pdiff
,因为
psum(x,-y,na.rm=TRUE)
会这样做。也许
ptimes
也是如此,但出于同样的原因,pdiv也不例外。但是我想,
psum
ptimes
更常见。刚才从这个答案中检查了
pmin
pmax
psum
的性能。长度为
1e5
1e3
的3个载体的复制和结果非常相似:分别为6.24、6.21和7.55秒。虽然我发现的其他版本的
psum
只有30个或更多。@Julius,如果您愿意,请随意编辑我的答案(或将您的基准测试作为答案发布),这个
psum
函数是个好主意。只需添加一项:如果所有元素(在向量中的相同位置)都是
NA
(即使
NA.rm=TRUE
),则
psum
pmax
都返回
NA
)。检查pmin(NA,NA,NA.rm=TRUE)。我稍微修改了您的函数以实现与
psum
相同的行为:
psum base
ifelse
Reduce
?这将是非常缓慢的
benchmark(
  rccmisc::psum(x,y,z,na.rm=TRUE),
  incadata::psum(x,y,z,na.rm=TRUE),
  kit::psum(x,y,z,na.rm=TRUE), 
  psum(x,y,z,na.rm=TRUE),
  psum2(x,y,z,na.rm=TRUE),
  replications=20
)
#                                    test replications elapsed relative
# 2 incadata::psum(x, y, z, na.rm = TRUE)           20   20.05   14.220
# 3      kit::psum(x, y, z, na.rm = TRUE)           20    1.41    1.000
# 4           psum(x, y, z, na.rm = TRUE)           20    8.04    5.702
# 5          psum2(x, y, z, na.rm = TRUE)           20   20.44   14.496
# 1  rccmisc::psum(x, y, z, na.rm = TRUE)           20   23.24   16.482