R: Выберите значения из таблицы данных в диапазоне - PullRequest
32 голосов
/ 05 марта 2011

У меня есть таблица данных в R:

name    date
----    ----
John    1156649280
Adam    1255701960
...etc...

Я хочу получить все строки с датой в пределах диапазона.В SQL я мог бы сказать SELECT * FROM mytable WHERE date > 5 AND date < 15

Что эквивалентно в R, чтобы выбрать строки на основе диапазона значений в конкретном столбце?

Ответы [ 3 ]

47 голосов
/ 05 марта 2011

Построить некоторые данные

df <- data.frame (name = c ("Джон", "Adam"), date = c (3, 5)) </p>

Извлечение точных совпадений:

subset(df, date==3)

  name date
1 John    3

Извлечение совпадений в диапазоне:

subset(df, date>4 & date<6)

  name date
2 Adam    5

Следующий синтаксис дает идентичные результаты:

df[df$date>4 & df$date<6, ]

  name date
2 Adam    5
14 голосов
/ 05 марта 2011

Здесь много опций, но одним из самых простых является subset.Обратите внимание:

> set.seed(43)
> df <- data.frame(name = sample(letters, 100, TRUE), date = sample(1:500, 100, TRUE))
> 
> subset(df, date > 5 & date < 15)
   name date
11    k   10
67    y   12
86    e    8

Вы также можете вставить логику непосредственно в индекс для вашего data.frame.Запятая отделяет строки от столбцов.Нам просто нужно помнить, что R сначала индексирует строки, а затем столбцы.Итак, здесь мы говорим строки с датой> 5 & <15 и затем со всеми столбцами: </p>

df[df$date > 5 & df$date < 15 ,]

Я бы также рекомендовал проверить страницы справки для подмножества, ?subset и логических операторов ?"&"

2 голосов
/ 26 марта 2018

Следует также рассмотреть другой интуитивный способ сделать это, используя filter() из dplyr.Вот несколько примеров:

set.seed(123)
df <- data.frame(name = sample(letters, 100, TRUE),
                 date = sample(1:500, 100, TRUE))
library(dplyr)
filter(df, date < 50) # date less than 50
filter(df, date %in% 50:100) # date between 50 and 100
filter(df, date %in% 1:50 & name == "r") # date between 1 and 50 AND name is "r"
filter(df, date %in% 1:50 | name == "r") # date between 1 and 50 OR name is "r"

# You can also use the pipe (%>%) operator
df %>% filter(date %in% 1:50 | name == "r")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...