如何避免出现此错误:负数只能与0混合?

时间:2019-04-09 09:18:19

标签: r

我有这个例子:

x=c(NA,  2,  -3,  -4,  -5,  -6,  -7,  -8,  -9, -10, -11,  -2,   2, -14, -15, -16, -17, 2, -19, -20)

g= head(x[!is.na(x)], 13)

我想排除已经用于g的值。

            y=x[-(head(x[!is.na(x)], 13))]

            Is there a better way to do this?

我收到此错误:

Error in x[-(head(x[!is.na(x)], 13))] : 
 only 0's may be mixed with negative subscripts

     any idea why?

2 个答案:

答案 0 :(得分:1)

您可以使用%in%来检查g中包含哪些值,并否定每个包含g定义中包含值的索引:

x[!(x %in% (head(x[!is.na(x)], 13))) | (1:length(x)) > which(cumsum(!is.na(x)) == 13)]

发生错误是因为您在x的子集中混合了正索引和负索引,这是不必要的,因为您不必使用索引而不是创建一个逻辑矢量来为您提供位置g中未包含的每个值。

编辑:我添加了第二个逻辑向量,以确保第13个非NA值的索引之后的值不能删除,因为它们永远不会包含在g中(因为{{ 1}}是x)的前13个非g值的子集。也许有一个更简单的解决方案,但是应该这样做。

答案 1 :(得分:0)

这实际上取决于您要解决的问题。如果要删除除NA以外的位置1-10处的元素,请使用:

  

pos = c(is.na(x [1:10]),11:length(x))

     

y = x [-pos]

如果要删除与元素2:10具有相同值的每个元素,请使用:

  

setdiff(x,g)

就错误而言,我想您的情况是x中的元素是正值和负值的混合。例如,

  

字母[c(-1,-3,5,6,7)]   错误:只有0可以与否定下标混合

此处给出了一个出色的描述:https://www.stat.berkeley.edu/~nolan/stat133/Fall05/notes/RSubset.html