Как фильтровать фрейм данных по диапазону значений строк с помощью R?

#r #dataframe #filter #row #subset

#r #фрейм данных #Фильтр #строка #подмножество

Вопрос:

У меня есть следующий фрейм данных, и я хочу отфильтровать фрейм данных, который содержит только значения от 2019-06-01 до 2019-06-30

     ds            yhat
1   2015-01-01    -100
2   2015-01-02     250
3   2015-01-03      50
460
5   2019-06-30     370
  

Комментарии:

1. Фильтрация по диапазону действительно предполагает Date объекты класса (в данном случае), но последнее значение в ds столбце является строкой. Если они действительно Date class, то x[x$ds >= as.Date("2019-06-01") amp; x$ds <= as.Date("2019-06-30"),] могут сработать. Доступны оба dplyr::between и data.table::between (в зависимости от ваших предпочтений), меняя это с dplyr::filter(x, between(ds, as.Date("2019-06-01"), as.Date("2019-06-30")) или as.data.table(x)[ between(ds, as.Date("2019-06-01"), as.Date("2019-06-30"), ] .

2. @r2evans хорошее наблюдение, я исправил пример.

Ответ №1:

Три метода, в зависимости от выбранной вами R-экосистемы:

 ### base R
subset(dat, as.Date("2019-06-01") <= ds amp; ds <= as.Date("2019-06-30"))
#           ds yhat
# 5 2019-06-30  370

### tidyverse
library(dplyr)
dplyr::filter(dat, between(ds, as.Date("2019-06-01"), as.Date("2019-06-30")))
#           ds yhat
# 5 2019-06-30  370

### data.table
library(data.table)
as.data.table(dat)[ between(ds, as.Date("2019-06-01"), as.Date("2019-06-30")), ]
#            ds yhat
# 1: 2019-06-30  370
  

(К вашему сведению: единственная причина, по которой я добавил dplyr:: filter , заключается в том, что некоторые могут попробовать вызов без загрузки dplyr и обнаружат, что stats::filter он ведет себя совсем по-другому. В общем, если вы library(dplyr) тогда сможете сделать просто filter(dat, ...) .)


Данные:

ds уже преобразованным в Date -class .)

 dat <- structure(list(ds = structure(c(16436, 16437, 16438, NA, 18077), class = "Date"), yhat = c(-100L, 250L, 50L, 60L, 370L)), row.names = c("1", "2", "3", "4", "5"), class = "data.frame")