假设我在R中有两个向量,定义如下。
a = c(3,3,5)
b = c(2,4,6)
是否有一个函数可以在a
的元素和b
的元素之间提供最大的成对,可以在公式中运行?
我试图这样做,max(a,b)
但它没有获得所需的输出。
期望的输出:
(3,4,6)
实际输出:
6
答案 0 :(得分:39)
成对最大值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
我从this question/answer提取的一对总和对我来说非常有用:
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
}
答案 1 :(得分:0)
牺牲b
的另一种方法:
# Where does b have smaller elements?
elsb <- which(a > b)
b[elsb] <- a[elsb]
b
# [1] 3 4 6
答案 2 :(得分:0)
实际上,替代解决方案值得一提。将其用于短向量。
向量a和b较短时,速度会快很多。更改代码中的变量s,您可以自己尝试一下。向量的长度为100(s = 20)时,PS C:\Users\admin> docker volume inspect test
[
{
"CreatedAt": "2020-05-01T10:59:22Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test/_data",
"Name": "test",
"Options": {},
"Scope": "local"
}
是两倍快。 pmax_new
在向量长度为2.500(s = 500)时超过了替代项。
pmax