R 如何在两个向量之间取成对平行最大值?

R 如何在两个向量之间取成对平行最大值?,r,max,R,Max,假设R中有两个向量,定义如下 a = c(3,3,5) b = c(2,4,6) 是否有一个函数可以给出a元素和b元素之间的成对最大值,该值可以在公式中运行 我试着做,max(a,b),但没有得到想要的输出 期望输出: C(3,4,6) 实际产量: 6 成对最大值,pmax(a,b),将给出c(3,4,6) 我从中提取的两两总和有时对我非常有用: psum(a, b) # == a + b # [1] 5 7 11 NA NA psum(a, b, na.rm = TRUE) # [

假设R中有两个向量,定义如下

a = c(3,3,5)
b = c(2,4,6)
是否有一个函数可以给出
a
元素和
b
元素之间的成对最大值,该值可以在公式中运行

我试着做,
max(a,b)
,但没有得到想要的输出

期望输出:

C(3,4,6)
实际产量:

6

成对最大值,
pmax(a,b)
,将给出
c(3,4,6)

我从中提取的两两总和有时对我非常有用:

psum(a, b) # == a + b
# [1]  5  7 11 NA NA

psum(a, b, na.rm = TRUE)
# [1]  5  7 11  0  1

psum(c(-1, NA, 4), c(0, NA, NA))
# [1] -1 NA NA

psum(c(-1, NA, 4), c(0, NA, NA), na.rm = TRUE)
# [1] -1 NA  4

psum <- 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 
}
psum(a,b)#==a+b
#[1]5711NA
psum(a、b、na.rm=TRUE)
# [1]  5  7 11  0  1
psum(c(-1,NA,4),c(0,NA,NA))
#[1]-1Na-NA
psum(c(-1,NA,4),c(0,NA,NA),NA.rm=TRUE)
#[1]-1na4

psum牺牲
b
的替代方法:

# Where does b have smaller elements?
elsb <- which(a > b)
b[elsb] <- a[elsb]
b
# [1] 3 4 6
#b在哪里有较小的元素?
elsb(b)

b[elsb]事实上,替代解决方案值得称赞。将其用于短向量

当向量a和b较短时,速度要快得多。更改代码中的变量s,您可以自己尝试。当向量的长度为100(s=20)时,
pmax_new
的速度是的两倍
pmax
以2.500(s=500)的矢量长度超过备选方案

require(微基准)

pmax\u另一个新的扩展是,这些函数用于两个以上的向量:
pmax(a,b,c)
等等,或者
do.call(pmax,list(a,b,c))
psum(a, b) # == a + b
# [1]  5  7 11 NA NA

psum(a, b, na.rm = TRUE)
# [1]  5  7 11  0  1

psum(c(-1, NA, 4), c(0, NA, NA))
# [1] -1 NA NA

psum(c(-1, NA, 4), c(0, NA, NA), na.rm = TRUE)
# [1] -1 NA  4

psum <- 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 
}
# Where does b have smaller elements?
elsb <- which(a > b)
b[elsb] <- a[elsb]
b
# [1] 3 4 6
require(microbenchmark)

pmax_new <- function(a, b) {
  elsb <- which(a > b)
  b[elsb] <- a[elsb]
  b
}

a <- c(3,3,5,NA,1)
b <- c(2,4,6,0,NA)
s <- 20
microbenchmark( pmax(rep(a, s), rep(b, s)), times = 1E6 )
microbenchmark( pmax_new(rep(a, s), rep(b, s)), times = 1E6)