Подмножество POSIXct времени на нечетные или четные секунды
Я хотел бы подмножество фрейма данных, чтобы сохранить только наблюдения, где секунды являются четным числом.
Вы можете скачать небольшую часть моих данныхздесь (100 строк).
Первые 6 строк выглядят так:
Timestamp C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 C13 C14
1 2013-04-01 00:00:00 0 1 1 1 1 0 1 1 1 1 0 1 0 1
2 2013-04-01 00:00:01 0 1 1 1 1 0 1 1 1 1 0 1 0 1
3 2013-04-01 00:00:02 0 1 1 1 1 0 1 1 1 1 0 1 0 1
4 2013-04-01 00:00:03 0 1 1 1 1 0 1 1 1 1 0 1 0 1
5 2013-04-01 00:00:04 0 1 1 1 1 0 1 1 1 1 0 1 0 1
6 2013-04-01 00:00:05 0 1 1 1 1 0 1 1 1 1 0 1 0 1
И я хотел бы, чтобы это выглядело так:
Timestamp C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 C13 C14
1 2013-04-01 00:00:00 0 1 1 1 1 0 1 1 1 1 0 1 0 1
2 2013-04-01 00:00:02 0 1 1 1 1 0 1 1 1 1 0 1 0 1
3 2013-04-01 00:00:04 0 1 1 1 1 0 1 1 1 1 0 1 0 1
4 2013-04-01 00:00:06 0 1 1 1 1 0 1 1 1 1 0 1 0 1
5 2013-04-01 00:00:08 0 1 1 1 1 0 1 1 1 1 0 1 0 1
6 2013-04-01 00:00:10 0 1 1 1 1 0 1 1 1 1 0 1 0 1
Я понимаю, как подмножество временных интервалов из здесь и здесь , но я не смог найти пример, который был бы похож на мой вопрос, и честно говоря, Я понятия не имею, с чего начать.
Спасибо!
Примечание: переменная Timestamp уже отформатирована в POSIXct.
4 ответа:
Без использования какого-либо внешнего пакета, вы могли бы сделать (для четных)
res = df[(as.numeric(substr(df$Timestamp, 18, 19)) %% 2) == 0,]
Для тестирования я использовал небольшое подмножество вашего фрейма данных:
df = data.frame(Timestamp = c("2013-04-01 00:00:00", "2013-04-01 00:00:01", "2013-04-01 00:00:02", "2013-04-01 00:00:03", "2013-04-01 00:00:04"), C01 = rep(0,5), C02 = rep(1,5)) df$Timestamp = as.POSIXct(df$Timestamp)
Вот что вы получаете (для четных):
#> res # Timestamp C01 C02 #1 2013-04-01 00:00:00 0 1 #3 2013-04-01 00:00:02 0 1 #5 2013-04-01 00:00:04 0 1
Для нечетных применяется та же логика, заменяя
==0
на==1
Я добавляю ответ, потому что, хотя все ответы хороши, ни один из них не признал тот факт, что объект POSIXct, когда он преобразуется в целые числа, на самом деле выражается в секундах (с 1 января 1970 года), поэтому на самом деле следующее работает также (но не будет, если вы пытаетесь выбрать нечетные и четные минуты, часы,...):
a <- seq(as.POSIXct("2013-04-01 00:00:00"),as.POSIXct("2013-04-01 01:00:00"),by="secs") a[as.integer(a)%%2==0]
library(lubridate) foo <- seq(as.POSIXct("2013-01-10"), as.POSIXct("2013-01-11"), by = "secs") secs <- second(foo) even <- foo[secs %% 2 == 0] odd <- foo[secs %% 2 == 1]
Ваша ссылка для загрузки не работала для меня, поэтому я не использовал ваши данные, но вы должны быть в состоянии подмножество вашего
data.frame
таким же образом.