#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
4 … 60
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")