通过比较不同大小的向量创建一个矩阵(没有 for 循环)

Create a matrix by comparing differently sized vectors (without a for loop)

我从 R 开始,并且很确定这可以通过 apply 函数之一实现。

我有两个不同大小的向量,a <- c('A', 'B', 'C')b <- c('A', 'B', 'C', 'D', 'E')

我想比较ab的值,在它们匹配的地方,在矩阵中放一个1,如果不匹配则放零。所以,使用上面的内容,看起来像:

    A   B   C   D   E
A   1   0   0   0   0
B   0   1   0   0   0
C   0   0   1   0   0

我可以通过 for 循环很容易地做到这一点,但是有没有更像 R 风格的方法来完成上述操作?

(抱歉,我认识到这可能是一个重复的问题,我只是不确定我应该搜索哪些术语)

试一试:

outer(a,b,"==")+0
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    0    0    0    0
#[2,]    0    1    0    0    0
#[3,]    0    0    1    0    0

如果需要行名和列名:

res<-outer(a,b,"==")+0
dimnames(res)<-list(a,b)

编辑

更有趣的一个:

`[<-`(matrix(0,nrow=length(a),ncol=length(b)),
      cbind(seq_along(a),match(a,b)),
      1)

你可以使用 table,只要你用 NA 填充较小的向量:

table(a=c(a,NA,NA),b)
   b
a   A B C D E
  A 1 0 0 0 0
  B 0 1 0 0 0
  C 0 0 1 0 0

您可以通过将较小元素的 length 更改为较大元素的 length 来更优雅地执行此操作(新元素默认设置为 NA):

length(a) <- length(b)
table(a,b)
   b
a   A B C D E
  A 1 0 0 0 0
  B 0 1 0 0 0
  C 0 0 1 0 0