0

几天内,我有一个 GPS 数据集,其中包含来自 5 个 GPS 设备(“节点”)的大约 5600 行坐标,我想将 GPS 点的数量减少到每小时一个点。因为每小时的点数是波动的,所以简单的 for 循环是不可能的。表的简化结构是这样的:

ID  node  easting  northing  year  month  day  hour  minute  time

“时间”列是 class "POSIXlt" "POSIXt"。尝试我的第一种方法,一个多重嵌套的 for 循环,我了解了Inferno 的第二个循环

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

4

3 回答 3

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)
  )
于 2017-06-21T12:19:07.447 回答
1

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

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

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

as.numeric(POSIXct_variable) / 3600

它将返回时间戳。

然后,您将在这个新列“Unix_hour”上进行分组:

aggregate(. ~ Unix_hour, df, mean)

(如果您以另一种方式聚合其他变量,请更改聚合函数“平均值”)

于 2017-06-21T11:59:51.350 回答
0

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

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使用from添加一小时楼层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()
于 2019-12-06T00:23:41.520 回答