R语言报错:only 0's may be mixed with negative subscripts的原因与解决
问题解析与解决方案
这个问题我之前处理类似的向量筛选时也踩过坑,咱们来一步步搞清楚:
报错原因
你写的head(x[!is.na(x)], 13)提取的是非NA元素的具体值,而不是这些元素在原向量x中的位置下标。当你用-(这些值)作为下标时,R会把这些数值当成「位置索引」来处理——但原向量里有负数元素(比如-3、-4),R的下标规则里:
- 正整数下标代表「选中对应位置的元素」
- 负整数下标代表「排除对应位置的元素」
你这里把元素值(比如2、-3)直接当成下标用,就会出现混合了正、负非零值的下标,R无法判断你到底是要选中位置2,还是排除位置3,规则冲突,所以抛出only 0's may be mixed with negative subscripts的错误。
最优实现方式
核心思路是:先获取非NA元素在原向量中的位置索引,而不是元素值,再基于位置来筛选和排除。
方法1:基于位置索引的直接筛选
x <- c(NA, 2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -2, 2, -14, -15, -16, -17, 2, -19, -20) # 1. 获取所有非NA元素的位置编号 non_na_pos <- which(!is.na(x)) # 2. 取前13个非NA元素的位置 g_pos <- head(non_na_pos, 13) # 3. 生成g:选中这些位置的元素 g <- x[g_pos] # 4. 生成y:排除这些位置的元素(保留剩下的所有元素,包括原有的NA) y <- x[-g_pos]
方法2:基于逻辑向量的标记筛选
如果你觉得位置索引不够直观,也可以用逻辑向量标记选中/未选中的元素:
x <- c(NA, 2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -2, 2, -14, -15, -16, -17, 2, -19, -20) # 1. 初始化一个和x长度相同的逻辑向量,默认都是FALSE selected <- logical(length(x)) # 2. 把前13个非NA元素的位置标记为TRUE selected[which(!is.na(x))[1:13]] <- TRUE # 3. 生成g和y g <- x[selected] y <- x[!selected]
这两种方法都能准确实现你的需求,而且完全符合R的下标规则,不会报错。
内容的提问来源于stack exchange,提问作者Tpellirn
相关产品推荐
相关产品推荐

