通过比较不同大小的向量创建一个矩阵(没有 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')
。
我想比较a
和b
的值,在它们匹配的地方,在矩阵中放一个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
我从 R 开始,并且很确定这可以通过 apply
函数之一实现。
我有两个不同大小的向量,a <- c('A', 'B', 'C')
和 b <- c('A', 'B', 'C', 'D', 'E')
。
我想比较a
和b
的值,在它们匹配的地方,在矩阵中放一个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