Фильтровать фрейм данных на основе + - x часов вокруг времени наблюдения - PullRequest
0 голосов
/ 06 мая 2020

У меня есть файл ascii, читаемый как фрейм данных, который выглядит следующим образом:

points <- data.frame(c(5.177, 6.57, 20.97, -1.18),
                       c(52.1, 46.49, 52.4, 60.14),
                       c("08:30:12", "09:45:20", "11:33:22", "14:12:43")
                       )

names(points) <- c('lon', 'lat', 'Time')

Реальный набор данных имеет около 150000 строк, а столбец времени - это класс «символ».

Теперь, что я хочу сделать, это отфильтровать на основе периода времени вокруг известного наблюдения. Допустим, это наблюдение произошло в 11:00:00 (время указано в UT C), и я хочу знать, какие измерения попадают в 3-часовой период этого известного наблюдения.

Поэтому мне нужно отфильтровать значения, которые не попадают в течение 1,5 часов + - от 11:00:00.

В конце я хочу выбрать ближайшее наблюдение в космосе, которое уже работает. Но я не могу понять, как выбрать, исходя из этого ограничения по времени. Окончательная функция выглядит примерно так:

nearestPixel <- function(matrix, station, time) {
  # filter based on time (3 hours around time of measurement)
  ## TODO ##

  # select just lat/lon from both datasets
  surfset <- SpatialPoints(surfmatrix[, 1:2])
  stationset <- SpatialPoints(station[, 2:3])

  # calculate closest point in distance
  nearest <- apply(gDistance(surfset, stationset, byid=TRUE), 1, which.min)

}

1 Ответ

1 голос
/ 06 мая 2020

, вы можете использовать приведенный ниже код вместо #todo, предполагая, что все время с одной даты. Я сохранил столбец Hour_Difference в данных только для справки, вы можете отменить его выбор, если не требуется

library(lubridate)
points$Time<- hms(points$Time) # changing it to time

t1<-hms("11:00:00") #reference time as mentioned by you

points %>% 
 dplyr::mutate(Hour_Difference=hour(t1-Time)) %>% 
  dplyr::filter(abs(Hour_Difference)<3) %>% 
  dplyr::select(-Hour_Difference)

output:

    lon   lat        Time Hour_Difference
1  6.57 46.49  9H 45M 20S               2
2 20.97 52.40 11H 33M 22S               0 

Или, если вам нужен один вкладыш:

points %>% 
  dplyr::filter(abs(lubridate::hour(t1-Time))<3) 

...