有pmin和pmax分别取na.rm,为什么没有psum?
看起来R可能缺少一个明显的简单函数:有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]
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 baseifelse
和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