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

时间:2015-06-09 10:29:54

标签: r apply

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

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

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

    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-esque方式来完成上述操作吗?

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

2 个答案:

答案 0 :(得分:2)

试试吧:

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)

答案 1 :(得分:1)

您可以使用table,只要您使用NA&#39;填充较小的矢量:

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(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 来更优雅地执行此操作(默认情况下将新元素设置为NA):

id="design-centre"