【发布时间】:2020-09-28 16:14:15
【问题描述】:
作为Efficient ways of creating matrix based on vector matches 的后续问题,如果我想在Y 和X 的每一列之间生成一个布尔矩阵匹配,我该怎么做:
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
由于性能原因,我对使用类似循环的函数犹豫不决。矢量化方法将不胜感激。谢谢
【问题讨论】: