Петля между posixlt в R - PullRequest
       28

Петля между posixlt в R

0 голосов
/ 08 января 2019

Я сталкиваюсь с ошибкой в ​​R при попытке зацикливания во времени. Вот подмножество моего фрейма данных (содержащего 120000 строк).

                 time value      mean group
1 2017-01-01 12:00:00 0.507 0.5106533    NA
2 2017-01-01 12:05:00 0.526 0.5106533    NA
3 2017-01-01 12:10:00 0.489 0.5106533    NA
4 2017-01-01 12:15:00 0.598 0.5106533    NA
5 2017-01-01 12:20:00 0.564 0.5106533    NA
6 2017-01-01 12:25:00 0.536 0.5106533    NA

Допустим, я хочу создать группы на основе периода времени с ожидаемым результатом, подобным этому:

                 time value      mean group
1 2017-01-01 12:00:00 0.507 0.5106533    A
2 2017-01-01 12:05:00 0.526 0.5106533    A
3 2017-01-01 12:10:00 0.489 0.5106533    B
4 2017-01-01 12:15:00 0.598 0.5106533    B
5 2017-01-01 12:20:00 0.564 0.5106533    C
6 2017-01-01 12:25:00 0.536 0.5106533    C

Я попробовал следующий код:

for (i in 1:length(merged.data$group)){
  if (merged.data[as.POSIXlt(i)$time >= "2017-05-15 12:00:00 GMT" & 
as.POSIXlt(i)$time <= "2017-05-29 12:00:00 GMT",]){
   merged.data$group == "A"} 
  else if (merged.data[as.POSIXlt(i)$time >= "2017-08-11 12:00:00" & 
as.POSIXlt(i)$time <= "2017-11-29 16:00:00",]){
    merged.data$group == "B"}
  else if (merged.data[as.POSIXlt(i)$time >= "2018-01-05 12:00:00" & 
as.POSIXlt(i)$time <= "2018-02-16 16:00:00",]){
    merged.data$group == "C"}
}

Я получаю следующую ошибку:

Error in as.POSIXlt.numeric(i) : 'origin' must be supplied

Не понимаю, я думал, что POSIXlt избавляется от проблем с происхождением? Хотя я признаю, что мое понимание проблем со временем в R немного сбивает с толку, и мне каждый раз приходится кодировать время, когда мне нужно иметь дело со временем / датами ...

Так что я надеюсь, что кто-то может мне помочь, не стесняйтесь, скажите мне, если я неясен или нужна дополнительная / лучшая информация, чтобы ответить на мой вопрос.

Спасибо заранее любителям стека!

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Спасибо за ответ, я узнал, что для меня была полезна только дата, так как в моем наборе данных были большие пробелы. Проще говоря, я обнаружил, что что-то работает:

merged.data $ group <-ifelse (merged.data $ date> = "2017-05-15" & merged.data $ date <= "2017-05-29", 1, ifelse (merged.data $ date> = "2017-08-11" & merged.data $ date <= "2017-11-29", 2, ifelse (merged.data $ date> = "2018-01-05" & merged.data $ date <= "2018-02-16", 3, Не Доступно ))) </p>

Это не работает с объектами POSIXlt, которые у меня были, но решение, предоставляемое Wimpel, похоже, работает (у меня проблема с использованием data.table, но это другая история!)

Еще раз спасибо, этот форум действительно очень помогает!

0 голосов
/ 08 января 2019

data.table подход ...

образец данных

library( data.table )

dt <- fread("time value mean 
2017-01-01T12:00:00 0.507 0.5106533    
2017-01-01T12:05:00 0.526 0.5106533    
2017-01-01T12:10:00 0.489 0.5106533   
2017-01-01T12:15:00 0.598 0.5106533    
2017-01-01T12:20:00 0.564 0.5106533    
2017-01-01T12:25:00 0.536 0.5106533    ", header = TRUE)

dt[, time := as.POSIXct( time, format = "%Y-%m-%dT%H:%M:%S" )]

код

library( data.table )
library( lubridate )

dt[, group := LETTERS[.GRP], by = lubridate::floor_date( time, "10 mins" ) ]

#             time value      mean group
# 1: 2017-01-01 12:00:00 0.507 0.5106533     A
# 2: 2017-01-01 12:05:00 0.526 0.5106533     A
# 3: 2017-01-01 12:10:00 0.489 0.5106533     B
# 4: 2017-01-01 12:15:00 0.598 0.5106533     B
# 5: 2017-01-01 12:20:00 0.564 0.5106533     C
# 6: 2017-01-01 12:25:00 0.536 0.5106533     C

обновление

подход с использованием foverlaps, на основе предоставленных данных примера и кода

library( data.table )

#create lookup-table with periods and group-names  
periods.dt <- data.table( 
  start = as.POSIXct( c( "2017-05-15 12:00:00", "2017-08-11 12:00:00", "2018-01-05 12:00:00" ), tz = "GMT" ),
  stop = as.POSIXct( c( "2017-08-11 12:00:00", "2018-01-05 12:00:00", "2018-02-16 16:00:00"), tz = "GMT" ),
  group = LETTERS[1:3] )
#set keys
setkey( periods.dt, start, stop ) 

#create sample data
dt <- fread("time value mean 
            2017-01-01T12:00:00 0.507 0.5106533    
            2017-01-01T12:05:00 0.526 0.5106533    
            2017-01-01T12:10:00 0.489 0.5106533   
            2017-01-01T12:15:00 0.598 0.5106533    
            2017-01-01T12:20:00 0.564 0.5106533    
            2017-01-01T12:25:00 0.536 0.5106533    ", header = TRUE)

dt[, time := as.POSIXct( time, format = "%Y-%m-%dT%H:%M:%S", tz = "GMT" )]

#create dummies to join on
dt[, `:=`( start = time, stop = time )]

#perform overlap join, no match --> NA
foverlaps( dt, periods.dt, type = "within", nomatch = NA)[, c("time", "value","mean","group"), with = FALSE]
#                   time value      mean group
# 1: 2017-01-01 12:00:00 0.507 0.5106533  <NA>
# 2: 2017-01-01 12:05:00 0.526 0.5106533  <NA>
# 3: 2017-01-01 12:10:00 0.489 0.5106533  <NA>
# 4: 2017-01-01 12:15:00 0.598 0.5106533  <NA>
# 5: 2017-01-01 12:20:00 0.564 0.5106533  <NA>
# 6: 2017-01-01 12:25:00 0.536 0.5106533  <NA>
...