You need to enable JavaScript to run this app. R语言中如何根据指定向量对矩阵每行对应列元素取反
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 18:45:03