如何获取R语言矩阵中仅单个非零元素的行索引?
解决方案
要找出矩阵中仅单个元素非零、其余全零的行索引,最简且通用的方法是利用rowSums()统计每行的非零元素个数,再筛选出个数为1的行:
# 计算每行非零元素的数量 non_zero_count <- rowSums(X != 0) # 获取符合条件的行索引 result <- which(non_zero_count == 1)
针对你的矩阵X,运行这段代码会返回4,正好是你期望的结果。
为什么你的原方法没成功?
你之前的代码:
test <- which(X[,2] != 0 & X[,-2] == 0)
存在两个问题:
- 硬编码了列位置:只能检查「第二列非零、其他列全零」的情况,如果目标行的非零元素在其他列,这个方法就失效了。
- 向量与矩阵的比较问题:
X[,-2] == 0返回的是一个5行4列的矩阵,而X[,2] != 0是长度为5的向量,两者进行&运算时会触发循环复制,最终得到的是一个矩阵而非行索引,自然无法得到正确结果。
补充:其他可行方法
如果你偏好使用apply(),也可以实现相同效果,但rowSums()的效率更高(因为是向量化操作):
which(apply(X != 0, 1, sum) == 1)
内容的提问来源于stack exchange,提问作者João Carvalho
相关产品推荐
相关产品推荐

