为什么R对空索引集执行删除操作时未得到预期结果?
该现象的底层逻辑
这个表现是R的固有设计而非bug,由负号运算和索引选择的执行规则决定:
- 你输入的
-REMOVE.ROW会先执行负号运算,当REMOVE.ROW为integer(0)时,负号作用在空整数向量上仍然返回integer(0) - R的索引规则默认:传入空向量作为行/列下标时,代表选择0个行/列,所以最终会返回0行0列的空矩阵,而非你预期的全选。
无需if判断的通用解决方法
你可以用setdiff()函数计算要保留的索引,完全适配空/非空删除索引的场景:
# 通用写法,自动处理空删除索引的情况 MATRIX[setdiff(seq(nrow(MATRIX)), REMOVE.ROW), setdiff(seq(ncol(MATRIX)), REMOVE.COL)]
如果你是用行名/列名作为删除索引,只需要把
seq(nrow(MATRIX))替换为rownames(MATRIX),seq(ncol(MATRIX))替换为colnames(MATRIX)即可,逻辑完全一致。
测试1:删除索引为空的场景
REMOVE.ROW <- integer(0) REMOVE.COL <- integer(0) MATRIX[setdiff(seq(nrow(MATRIX)), REMOVE.ROW), setdiff(seq(ncol(MATRIX)), REMOVE.COL)]
运行后将返回完整的原矩阵,符合预期。
测试2:删除索引非空的场景
REMOVE.ROW <- 3 REMOVE.COL <- 2 MATRIX[setdiff(seq(nrow(MATRIX)), REMOVE.ROW), setdiff(seq(ncol(MATRIX)), REMOVE.COL)]
运行结果和你原来用负索引的结果完全一致,不会影响正常的删除逻辑。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

