Если у меня есть фрейм данных, и я хочу выбрать тренировочный набор на основе временного диапазона
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, которые я мог бы использовать.
Ответы, которые я просмотрел, прежде чем опубликовать свой вопрос.
:
не даст вам диапазон строк для выбора. Вам нужно узнать соответствующий индекс, а затем создать последовательность между ними, а затем подмножество
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, ]
Я оставил это так для ясности, вы можете сделать это однострочным.