从矩阵中的每个点获取最大值

Bat*_*hek 2 r max matrix

我有2个数据帧

a = c(1,1,3)
b = c(7,2,1)
c = c(2,4,2)

d1 = cbind(a,b,c)

d = c(2,1,6)
e = c(1,4,2)
f = c(4,8,4)

d2 = cbind(d,e,f)
Run Code Online (Sandbox Code Playgroud)

如何在每个点轻松获取最大值的数据框

_fun(d1,d2)

     a b c
[1,] 2 7 4
[2,] 1 4 8
[3,] 6 2 4
Run Code Online (Sandbox Code Playgroud)

我可以使用循环来实现它,但对于大数据帧来说它非常慢.

谢谢!

akr*_*run 6

我们可以将数据集保存在a中listdo.callfas一起使用pmax.

do.call(pmax, list(d1, d2))
#     a b c
#[1,] 2 7 4
#[2,] 1 4 8
#[3,] 6 2 4
Run Code Online (Sandbox Code Playgroud)

pmax直接使用

pmax(d1, d2)
Run Code Online (Sandbox Code Playgroud)

编辑:根据@ nicola的评论.

它可能更快使用pmax.int,但转换回matrix可能会更慢.

matrix(pmax.int(d1, d2), dim(d1))
Run Code Online (Sandbox Code Playgroud)

基准

set.seed(24)
m1 <- matrix(sample(0:9, 5000*5000, replace=TRUE), ncol=5000)
set.seed(48)
m2 <- matrix(sample(0:9, 5000*5000, replace=TRUE), ncol=5000)
akrun1 <- function() pmax(m1, m2)
akrun2 <- function() matrix(pmax.int(m1, m2), dim(m1))
colonel <- function() ifelse(m1 > m2, m1, m2)
system.time(akrun1())
#   user  system elapsed 
#  0.850   0.033   0.885 
system.time(akrun2())
#   user  system elapsed 
#  1.090   0.021   1.114 

system.time(colonel())
#   user  system elapsed 
#  5.049   0.336   5.395 
Run Code Online (Sandbox Code Playgroud)

  • 不需要任何"减少".只是`pmax(d1,d2)`有效.此外,如果要比较的元素超过两个,则应使用`do.call`而不是`Reduce`(速度较慢).`do.call(pmax,list(d1,d2))`好多了. (2认同)