我从R开始,很确定这可以通过apply
函数之一实现。
我有两个不同大小的向量,a <- c('A', 'B', 'C')
和b <- c('A', 'B', 'C', 'D', 'E')
。
我想比较a
和b
的值,以及它们匹配的位置,将一个放在矩阵中,如果它们不匹配则为零。所以,使用上面的内容,看起来像:
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方式来完成上述操作吗?
(抱歉,我承认这可能是一个重复的问题,我只是不确定我应该搜索哪些条款)
答案 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"