Подмножество данных в R с использованием нескольких выражений неравенства

Проблема

Этот вопрос является расширением темы подмножества с использованием нескольких логических условий, особенно строгих неравенств, для подмножества фрейма данных в R (см. здесь и здесь).

Скажем, моя переменная находится в диапазоне от 0 до 100. Мне нужно создать подмножество, которое возвращает значения от 50 до 100, но также и значения меньше 25.

# Data
df$var = seq(1:100)

# Desired Subset
df$var[df$var > 50 & df$var < 100 & df$var < 25]

Вопрос

  • Каков наилучший способ создать подмножество, включающее несколько неравенств, с использованием базы R?
  • Являются ли решения, использующие небазовые пакеты R, более элегантными?

person Danielle    schedule 29.05.2017    source источник
comment
Два хороших решения dplyr и data.table. Может ли кто-нибудь рассказать, как это будет работать, используя подмножество [ ] для сравнения? Или объясните, почему это невозможно?   -  person Danielle    schedule 30.05.2017


Ответы (3)


Поскольку OP запрашивает метод подмножества base-R и, глядя на ответы (похоже, они хотят того, чего хочет OP), будет полезно следующее:

df$var[(df$var > 50 & df$var < 100) | df$var < 25]

Если вы хотите иметь переменные от 50 до 100 и также меньше 25, вам нужно использовать оператор | (эквивалент ИЛИ, как вы можете видеть в других ответах), чтобы получить желаемое подмножество. Посмотрите ниже вывод;

>
#[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 51 52 53 54 
#[29] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 
#[57] 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
person M--    schedule 30.05.2017

Для этого можно использовать dplyr фильтры. Используйте «|» для «или».

library(dplyr)
df %>% 
  filter(var < 25 | (var > 50 & var < 100)) 
person neilfws    schedule 29.05.2017
comment
Есть ли способ использовать эту логику, но чтобы результатом был только один вектор набора данных? Начиная с df$var %>% не работает. У меня похожая проблема при попытке использовать: df$var(df$var[which(df$var < 25 | (df$var > 50 & df$var< 100)),]). - person Danielle; 30.05.2017
comment
Если вы имеете в виду, что вывод должен быть просто столбцом var, добавьте %>% select(var) в конец кода в моем ответе. - person neilfws; 30.05.2017
comment
И если вы имеете в виду, что вывод должен быть вектором, то добавьте %>% unlist(use.names = FALSE) после select. - person neilfws; 30.05.2017
comment
Отличное объяснение того, как получить только один столбец (например, df$var) и отформатировать его как вектор. Мне также интересно узнать, почему начало с df$var %in% не сработает. - person Danielle; 30.05.2017
comment
По сути, потому что dplyr работает с фреймами данных, а его функции работают со столбцами или строками. - person neilfws; 31.05.2017

Мы можем использовать data.table

 library(data.table)
 setDT(df)[var < 25 |(var > 50 & var < 100)]
person akrun    schedule 30.05.2017