R:数据框中每小时一个值

R: One value per hour in data frame

几天来,我从 5 个 GPS 设备 ('nodes') 获得了一个包含大约 5600 行坐标的 GPS 数据集,我想将 GPS 点数减少到每小时一个点。因为每小时的点数波动,所以简单的 for 循环是不可能的。 table 的简化结构是这样的:

ID  node  easting  northing  year  month  day  hour  minute  time

第 'time' 列是 class "POSIXlt" "POSIXt"。 尝试我的第一种方法,一个多重嵌套的 for 循环,我了解了 Second circle of Inferno.

有人知道如何将多行(每小时)减少到一(每小时),由 R 中的每个设备分隔。

您可以创建一个新列"Unix_hour":UNIX 时间戳除以 3600。

因此,您每个小时都会有一个唯一的 ID。

为此,您应该使用 as.numeric 将 POSIXct 日期转换为 Unix 时间戳(以秒为单位):

as.numeric(POSIXct_variable) / 3600

它将return时间戳。

然后,您将根据这个新列分组 "Unix_hour":

aggregate(. ~ Unix_hour, df, mean)

(如果您以其他方式聚合其他变量,请更改聚合函数 "mean")

假设年、月、日、时间列包含与时间列相关的信息,解决方案可以如下:

# 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)
  )

您可以将日期时间的多列转换为一列,例如:

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_datelubridate

添加一个小时楼层
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()