Выберите диапазон данных из метки времени на основе row.names

Если у меня есть фрейм данных, и я хочу выбрать тренировочный набор на основе временного диапазона

df <- data.frame(timestamp = seq(as.POSIXct('2013-08-02 12:00:00'),
                                as.POSIXct('2013-08-06 05:00:00'), len =(45), 
                   x = sample(1:100, 45), y = sample(200:500, 45)))

Теперь я преобразую временную метку в row.names.

row.names(df) = df$timestamp

Поскольку я проиндексировал row.names, я должен иметь возможность выбрать диапазон для тренировочного набора:

 # Select the range 
 s = '2013-08-02 12:00:00'
 e = '2013-08-03 10:15:00'

 # Select the training dataset 

 training = df[s:e,]

Но когда я запускаю приведенный выше код, я получаю следующую ошибку:

 #Error in s:e : NA/NaN argument
 #In addition: Warning messages:
 #1: In `[.data.frame`(df, s:e, ) : NAs introduced by coercion
 #2: In `[.data.frame`(df, s:e, ) : NAs introduced by coercion

Может кто-нибудь объяснить, что я делаю неправильно здесь!

Я знаю, что ts или какой-то другой пакет решит проблему, но нет ли каких-либо базовых функций R, которые я мог бы использовать.

Ответы, которые я просмотрел, прежде чем опубликовать свой вопрос.

Выбор строк в определенном временном диапазоне

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
275
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

: не даст вам диапазон строк для выбора. Вам нужно узнать соответствующий индекс, а затем создать последовательность между ними, а затем подмножество

df[which(row.names(df) == s) : which(row.names(df) == e), , drop = FALSE]

#                              timestamp
#2013-08-02 12:00:00 2013-08-02 12:00:00
#2013-08-02 14:01:21 2013-08-02 14:01:21
#2013-08-02 16:02:43 2013-08-02 16:02:43
#2013-08-02 18:04:05 2013-08-02 18:04:05
#2013-08-02 20:05:27 2013-08-02 20:05:27
#2013-08-02 22:06:49 2013-08-02 22:06:49
#2013-08-03 00:08:10 2013-08-03 00:08:10
#2013-08-03 02:09:32 2013-08-03 02:09:32
#2013-08-03 04:10:54 2013-08-03 04:10:54
#2013-08-03 06:12:16 2013-08-03 06:12:16
#2013-08-03 08:13:38 2013-08-03 08:13:38
#2013-08-03 10:15:00 2013-08-03 10:15:00

Если существует вероятность нескольких значений s и e, в таких случаях лучше использовать which.max, поскольку which.max возвращает индекс первого максимума.

Более того, вам вообще не нужно конвертировать в rownames. Вы можете добиться того же с самой колонкой timestamp.

df[which.max(df$timestamp == s) : which.max(df$timestamp == e), , drop = FALSE]

Это простая инструкция индексации.

inx <- as.POSIXct(s) <= row.names(df) & row.names(df) <= as.POSIXct(e)
df[inx, ]

Я оставил это так для ясности, вы можете сделать это однострочным.

Другие вопросы по теме