R语言中如何根据指定向量对矩阵每行对应列元素取反
原有代码问题
- 你在
apply的匿名函数中完全没有用到传入的当前行变量x,反而直接操作全局的mm矩阵,逻辑完全偏离逐行处理的预期。 - 索引写法错误:
mm[,ii]是选中所有行的ii列,mm[ii]是按向量索引取mm的前length(ii)个元素,完全不符合逐行指定列取反的需求。 - 没有处理
apply返回结果的维度:apply按行遍历返回的结果是列优先排列的矩阵,不做转置直接赋值会出现维度错乱。
可行解法
方法1:直接列索引(所有行取相同的指定列取反,效率最高)
如果你的需求是所有行都对ii指定的相同列做取反,不需要循环,直接批量操作即可:
# 生成测试矩阵,固定随机种子方便复现 set.seed(123) mm <- matrix(round(runif(9)),3,3) ii <- c(1,2,3) # 核心代码:+号用于将取反后的逻辑值TRUE/FALSE转回1/0 mm[, ii] <- +(!mm[, ii])
方法2:矩阵索引(每行对应取ii中单个列取反)
如果ii的长度和矩阵行数相等,ii[i]代表第i行要取反的列号,用矩阵索引实现:
# 生成测试矩阵 set.seed(123) mm <- matrix(round(runif(9)),3,3) ii <- c(1,2,3) # 对应第1行取第1列、第2行取第2列、第3行取第3列取反 # 核心代码:构造行列配对的索引矩阵 idx <- cbind(1:nrow(mm), ii) mm[idx] <- +(!mm[idx])
方法3:修正后的apply写法
如果你确实需要用apply实现逐行处理,修正后的写法如下:
# 生成测试矩阵 set.seed(123) mm <- matrix(round(runif(9)),3,3) ii <- c(1,2,3) # 核心代码:逐行处理后转置回原维度,再转成整数型 mm <- t(apply(mm, 1, function(x) { x[ii] <- !x[ii] return(x) })) mm <- matrix(as.integer(mm), nrow = nrow(mm))
内容的提问来源于stack exchange,提问作者Expectation mean first moment
相关产品推荐
相关产品推荐

