Выберите диапазон данных из отметки времени на основе имен строк. - PullRequest
1 голос
/ 22 мая 2019

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

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

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

 # 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, которые я могу использовать.

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

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

Ответы [ 2 ]

1 голос
/ 22 мая 2019

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

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

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

1 голос
/ 22 мая 2019

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

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]
...