我有这个例子:
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?
答案 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