【问题标题】:Efficient matrix constructions from column-by-column comparison逐列比较的高效矩阵结构
【发布时间】:2020-09-28 16:14:15
【问题描述】:

作为Efficient ways of creating matrix based on vector matches 的后续问题,如果我想在YX 的每一列之间生成一个布尔矩阵匹配,我该怎么做:

X <- data.frame(
  x1 = c('dog', 'cow', 'horse', 'rabbit', 'bear', 'seal', 'lion', 'ostrich','cat', 'hamster'),
  x2 = c(NA, 'dog', NA, NA, NA, NA, NA, 'hamster',NA, NA),
  x3 = c('ostrich', NA, NA, NA, 'bear', NA, NA, NA,NA, NA)
)

Y <- data.frame(
  y1 = c('beaver', 'crow', 'donkey', 'lion', 'bear', 'fox', 'moose', 'mole'),
  y2 =  c(NA, NA, NA, 'bear', NA, NA, 'moose', NA)
)

这种情况下的预期输出是两个矩阵,相当于outer(... FUN = "==")产生的结果:

> outer(X$x1, Y$y1, FUN = "==")
       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
 [1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [5,] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
 [6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [7,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 [8,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[10,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

outer(X$x2, Y$y2, FUN = "==")
      [,1] [,2] [,3]  [,4] [,5] [,6]  [,7] [,8]
 [1,]   NA   NA   NA    NA   NA   NA    NA   NA
 [2,]   NA   NA   NA FALSE   NA   NA FALSE   NA
 [3,]   NA   NA   NA    NA   NA   NA    NA   NA
 [4,]   NA   NA   NA    NA   NA   NA    NA   NA
 [5,]   NA   NA   NA    NA   NA   NA    NA   NA
 [6,]   NA   NA   NA    NA   NA   NA    NA   NA
 [7,]   NA   NA   NA    NA   NA   NA    NA   NA
 [8,]   NA   NA   NA FALSE   NA   NA FALSE   NA
 [9,]   NA   NA   NA    NA   NA   NA    NA   NA
[10,]   NA   NA   NA    NA   NA   NA    NA   NA

由于性能原因,我对使用类似循环的函数犹豫不决。矢量化方法将不胜感激。谢谢

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    我不完全确定你在追求什么,但也许是这样的?

    l <- min(lengths(list(X, Y)))
    Map(function(x, y) outer(x, y, FUN = '=='), X[seq_len(l)], Y[seq_len(l)])
    

    结果:

    $x1
           [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
     [1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
     [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
     [3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
     [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
     [5,] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
     [6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
     [7,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
     [8,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
     [9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [10,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    
    $x2
          [,1] [,2] [,3]  [,4] [,5] [,6]  [,7] [,8]
     [1,]   NA   NA   NA    NA   NA   NA    NA   NA
     [2,]   NA   NA   NA FALSE   NA   NA FALSE   NA
     [3,]   NA   NA   NA    NA   NA   NA    NA   NA
     [4,]   NA   NA   NA    NA   NA   NA    NA   NA
     [5,]   NA   NA   NA    NA   NA   NA    NA   NA
     [6,]   NA   NA   NA    NA   NA   NA    NA   NA
     [7,]   NA   NA   NA    NA   NA   NA    NA   NA
     [8,]   NA   NA   NA FALSE   NA   NA FALSE   NA
     [9,]   NA   NA   NA    NA   NA   NA    NA   NA
    [10,]   NA   NA   NA    NA   NA   NA    NA   NA
    

    请注意,Map 仍然是一个“类似循环的函数”。

    【讨论】:

    • 谢谢你,这行得通,虽然我希望能更快:)
    • 您可以轻松地并行执行此操作,例如使用parallel::clusterMap,或future.apply::future_Map
    • 哦啦啦,还没有检查并行计算,但这绝对是这样做的理由。谢谢!
    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2017-08-13
    • 1970-01-01
    • 2013-05-04
    相关资源
    最近更新 更多