R: одно значение в час во фрейме данных
У меня есть набор данных GPS с примерно 5600 строками координат от 5 устройств GPS ("узлов") в течение нескольких дней, и я хочу сократить количество точек GPS до одной точки в час. Поскольку количество точек в час колеблется, простой цикл for невозможен. Упрощенная структура таблицы будет такой:
ID node easting northing year month day hour minute time
Столбец "время" является классом "POSIXlt" "POSIXt"
, Испытывая мой первый подход, множественный вложенный цикл for, я узнал о Втором круге Inferno.
Есть ли у кого-нибудь идеи, как уменьшить количество строк (в час) до одного (в час), разделенных каждым устройством в R.
2 ответа
Предполагая, что столбцы год, месяц, день и время содержат информацию, относящуюся к столбцу времени, решение может быть следующим:
# Generate data
md <- data.frame(
node = rep(1:5, each = 2)
, easting = sample(1:10, size = 20, replace = TRUE)
, northing = sample(1:10, size = 20, replace = TRUE)
, year = 2017
, month = "June "
, day = 6
, hour = rep(1:2, each = 2, times = 5)
, minute = NA
, time = NA
)
# Solution
library(dplyr)
md %>%
group_by(node, year, month, day, hour) %>%
summarize(
easting = mean(easting),
northing = mean(northing)
)
Вы можете создать новый столбец "Unix_hour": метка времени UNIX, разделенная на 3600.
Таким образом, у вас будет уникальный идентификатор для каждого часа.
Для этого вам нужно использовать as.numeric для преобразования даты POSIXct в метку времени Unix (в секундах):
as.numeric(POSIXct_variable) / 3600
Он вернет метку времени.
Затем вы просто сгруппируете по этому новому столбцу "Unix_hour":
aggregate(. ~ Unix_hour, df, mean)
(Измените агрегатную функцию на "среднее", если вы агрегируете другие переменные другим способом)
Вы можете преобразовать несколько столбцов для даты и времени в один, например:
DateTimeUTCmin5 <- ISOdate(year = tmp$Year,
month = tmp$Month,
day = tmp$Day,
hour = tmp$Hour,
min = tmp$Min,
sec = tmp$Sec,
tz = "America/New_York")
добавить часовой этаж, используя floor_date
из lubridate
df$HourFloor = floor_date(df$DateTimeUTCmin5, unit = "hour")
затем решите, как вы хотите извлечь данные за этот час, сначала в среднем, максимум?
Hourstats <- df %>% group_by(HourFloor) %>%
summarise(meanEast = mean(easting, na.rm = TRUE),
firstNorth = first(northing, na.rm = TRUE))) %>%
ungroup()