У меня есть этот пример:
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?
x[!(x %in% g)]
?
Нет не будет работать, так как 2
существует в g
, но также не следует исключать в y
, так как их два 2
.
Следует исключить только первые 10 значений.
На самом деле это зависит от проблемы, которую вы решаете. Если вы хотите удалить элементы в позициях 1-10, кроме NA, используйте:
pos = c(is.na(x[1:10]), 11:length(x))
y = x[-pos]
Если вы хотите удалить каждый элемент, который принимает то же значение, что и элементы 2:10, используйте:
setdiff(x,g)
Что касается ошибки, я думаю, в вашем случае элементы в x представляют собой смесь положительных и отрицательных значений. Например,
letters[c(-1, -3, 5, 6, 7)] Error: only 0's may mix with negative subscripts
Блестящее описание дано здесь: https://www.stat.berkeley.edu/~nolan/stat133/Fall05/notes/RSubset.html
Вы можете использовать %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
(потому что g
является подмножеством первых 13 не-NA
-значений из х). Может быть более простое решение, но это должно сделать это.
NA -15 -16 -17 -19 -20
неверно, так как положительные значения 2
были удалены
setdiff(x, g)
будет работать?