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_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()
几天来,我从 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_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()