2016-09-19 3 views
1

У меня есть ряд чисел, которые включают в себя как целые числа, так и десятичные числа. Когда я пытаюсь подмножить этот список, используя серию чисел, он игнорирует десятичные числа при подмножестве. Как получить диапазон подмножества, чтобы включить десятичные знаки?Как включить десятичные числа в последовательность «:»

Примечание: Я понимаю, что seq может быть использован для создания последовательности с разными десятичными знаками (например, see here), но что, если я хочу сделать это, используя фактических значения из моих данных вместо недавно созданной последовательности?

Возможно ли это?

Например:

vec <- c(-1, 0, 0.5, 0.9, 1, 1.2, 1.3, 5, 5.4, 6, 7, 9) 

vec[!(vec %in% 0:2)] 
[1] -1.0 0.5 0.9 1.2 1.3 5.0 5.4 6.0 7.0 9.0 

#But what I want is: 
[1] -1.0 5.0 5.4 6.0 7.0 9.0 

И

vec[!(vec %in% 1.2:5.4)] 
[1] -1.0 0.0 0.5 0.9 1.0 1.3 5.0 5.4 6.0 7.0 9.0 

#But what I want is: 
[1] -1.0 0.0 0.5 0.9 1.0 6.0 7.0 9.0 
+0

Как насчет 'VEC [! (VEC> = 0 & VEC <2)]'? – Vandenman

+0

Аналогично, 'setdiff (vec, vec [vec> = 0 & vec <2])' – SymbolixAU

+1

Я иногда использую '\'% btwn% \ '<- function (a, b) a> = min (b) & a <= max (b) ', в этом случае это будет' vec% btwn% 0: 2' – Gregor

ответ

1

Это еще один подход, который использует findInterval. Я считаю эту функцию удобной, избегая сложных вложенных конструкций ifelse. В данном случае это действительно кажется, лучше, чем комментарии предлагают использовать vec[!(vec >= 0 & vec < 2)]. findInterval` возвращает вектор чисел до тех пор, как его первый вход и может быть использовано для индексирования:

vec <- c(-1, 0, 0.5, 0.9, 1, 1.2, 1.3, 5, 5.4, 6, 7, 9) 
vec [ findInterval(vec, c(0,2)) != 1] 
#[1] -1.0 5.0 5.4 6.0 7.0 9.0 

Просто не может использовать : поскольку оно только поддерживает целые числа.

0

Другой подход, использующий between функцию dplyr пакета

vec[!dplyr::between(vec,0,2)] 
#[1] -1.0 5.0 5.4 6.0 7.0 9.0 
vec[!dplyr::between(vec,1.2,5.4)] 
#[1] -1.0 0.0 0.5 0.9 1.0 6.0 7.0 9.0 
Смежные вопросы