52

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

a = c(3,3,5)
b = c(2,4,6)

是否有一个函数可以给我 的元素a和 的元素之间的成对最大值b,它可以在公式中运行?

我试图这样做,max(a, b)但它没有得到想要的输出。

期望的输出:

C(3,4,6)

实际输出:

6
4

3 回答 3

63

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

a <- c(3,3,5,NA,1)
b <- c(2,4,6,0,NA)

pmax(a, b)
# [1]  3  4  6 NA NA

pmax(a, b, na.rm = TRUE)
# [1] 3 4 6 0 1

还有一个成对的最小值

pmin(a, b)
# [1]  2  3  5 NA NA

pmin(a, b, na.rm = TRUE)
# [1] 2 3 5 0 1

我从这个问题/答案中提取的成对总和有时对我非常有用:

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 
}
于 2013-11-15T06:15:15.610 回答
2

另一种牺牲的方法b

# Where does b have smaller elements?
elsb <- which(a > b)
b[elsb] <- a[elsb]
b
# [1] 3 4 6
于 2018-11-30T08:13:42.617 回答
2

实际上,替代解决方案值得称赞。将其用于短向量。

当向量 a 和 b 很短时,它会快很多。更改代码中的变量 s 可以自己尝试。当向量的长度为 100 (s=20)时,速度pmax_new两倍pmax在向量长度为​​ 2.500 (s=500) 处超过替代方案。

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)
于 2020-05-01T11:04:34.877 回答