如何在R语言中生成数值向量元素两两相等的TRUE/FALSE矩阵?
生成元素两两相等的逻辑矩阵解决方案
嘿,我来帮你搞定这个问题!你想要把向量 x <- c(1,2,3,3) 的所有元素两两比较,生成一个4×4的TRUE/FALSE矩阵,先看看你之前循环代码的问题:
matx <- matrix(FALSE,nrow=length(x),ncol=length(x))
for(i in nrow(matx)) {
for (j in ncol(matx)) {
matx[x==x[i],] <- TRUE
}
}
你的循环有两个核心问题:
for(i in nrow(matx))只会让i取到4这一个值(因为nrow(matx)返回的是单个数字4),正确的应该是遍历1到4,也就是1:nrow(matx)- 内层循环的j完全没用到,赋值逻辑也不对,你直接把整行设为TRUE,而不是逐个位置判断
下面给你几种更靠谱的解法:
方法一:用outer函数(最简洁高效)
R里的outer()函数专门用来处理两个向量的所有元素对的操作,直接用==作为比较函数就行,一行代码搞定:
x <- c(1,2,3,3) matx <- outer(x, x, `==`) matx
运行后会得到你想要的矩阵:
[,1] [,2] [,3] [,4] [1,] TRUE FALSE FALSE FALSE [2,] FALSE TRUE FALSE FALSE [3,] FALSE FALSE TRUE TRUE [4,] FALSE FALSE TRUE TRUE
方法二:修正后的循环写法
如果你一定要用循环实现,那需要遍历每个行和列的位置,逐个比较赋值:
x <- c(1,2,3,3) matx <- matrix(FALSE, nrow = length(x), ncol = length(x)) for(i in 1:nrow(matx)) { for(j in 1:ncol(matx)) { matx[i, j] <- (x[i] == x[j]) } } matx
这个循环会逐个检查每个(i,j)位置对应的x元素是否相等,然后给矩阵赋值。
方法三:利用矩阵广播特性
R支持向量和矩阵的广播运算,把x转成列向量后和原行向量比较,也能得到结果:
x <- c(1,2,3,3) matx <- x == t(x) matx
这里t(x)把x转成4行1列的矩阵,x本身是1行4列的向量,两者比较时会自动广播成4×4的矩阵,完成两两比较。
内容的提问来源于stack exchange,提问作者Ro.han.solo
相关产品推荐
相关产品推荐

