Я хочу отфильтровать предыдущую близкую дату моего кадра данных к данной дате - PullRequest
2 голосов
/ 02 февраля 2020

У меня есть этот фрейм данных

   Data <- c("2013-08-03", "2013-09-04", "2013-09-08", "2013-09-12", "2013-11-01")
   prezzi <- c(1,2,3,4,5)
   t <- data.frame(Data, prezzi)

   Time <- "2013-09-11"

Я хочу отфильтровать фрейм данных Data по предыдущей ближайшей дате к данной дате Time

Выходные данные

Data         Prezzi
2013-09-08     3

Я использую этот код filter(Data == t$Data[which.min(abs(Time - as.Date(t$Data)))]), и он не работает. Результат 2013-09-12, но я хочу предыдущую близкую дату (2013-09-08.

Ответы [ 4 ]

1 голос
/ 02 февраля 2020

Менее просто, чем ответ @ akrun, вы можете сначала отфильтровать по дате ниже «Время», а затем сохранить максимальную дату в подмножестве:

library(dplyr)
t %>% filter(as.Date(Data) < as.Date(Time)) %>%
  filter(as.Date(Data) == max(as.Date(Data)))

        Data prezzi
1 2013-09-08      3
1 голос
/ 02 февраля 2020

1) Использование только базы R дает наибольшую дату до Времени:

tail(subset(t, Time > format(Data)), 1)
##         Data prezzi
## 3 2013-09-08      3

2) или использование dplyr:

t %>%
  filter(Time > format(Data)) %>%
  slice(n())

3) или с использованием sqldf:

library(sqldf)

fn$sqldf("select max(Data) Data, prezzi from t
  where '$Time' > Data")
##         Data prezzi
## 1 2013-09-08      3
1 голос
/ 02 февраля 2020

Мы можем вычесть 1 из which.min. Если «Данные» не упорядочены, нам может понадобиться сначала заказать их

t1 <- t[order(t$as.Date(Data)),]
i1 <- with(t1, which.min(abs(as.Date(Time) - as.Date(Data)))-1)
t1[i1, , drop = FALSE]
#        Data prezzi
#3 2013-09-08      3

Если мы используем dplyr

library(dplyr)
t %>%
    mutate(Data = as.Date(Data)) %>%
    arrange(Data) %>%
    slice(which.min(abs(as.Date(Time) - Data)) - 1)
#        Data prezzi
#1 2013-09-08      3

Обновление

Если OP рассматривает не на основе предыдущей строки, а только строки, которые отличаются от минимального отличия от «Time», тогда используйте findInterval

Time <- "2013-09-09"
t[findInterval(as.Date(Time), as.Date(t$Data)),]
#        Data prezzi
#3 2013-09-08      3
0 голосов
/ 02 февраля 2020

Один путь в базе R будет:

#Convert to date class
t$Data <- as.Date(t$Data)
Time <- as.Date("2013-09-11")

#Get difference between date and time
inds <- t$Data - Time
#Select the one with minimum difference
t[inds == max(inds[inds < 0 ]), ]

#        Data prezzi
#3 2013-09-08      3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...