ltraj对象技术问题:如何提取日均距离与时间并解决aggregate报错?
解决ltraj对象提取每日平均距离与时间的问题
我明白你遇到的问题了——之前用aggregate出错是因为分组参数的长度不匹配,你把格式字符串直接放进list里了,它和日期向量的长度不一样,自然会报错。下面给你一步步的解决方法:
第一步:处理日期分组变量
首先得把带时分秒的日期字符串转换成仅保留年月日的分组变量,这样才能按天聚合。你可以用基础R的as.Date()函数,注意要对应你的日期格式"%d/%m/%Y %H.%M.%S":
# 先把ltraj里的第一个轨迹提取成数据框 track_df <- traj[[1]] # 新增一列仅含年月日的日期变量 track_df$day <- as.Date(track_df$date, format = "%d/%m/%Y %H.%M.%S")
如果你习惯用lubridate包(处理日期更省心),也可以这么写:
library(lubridate) track_df$day <- dmy_hms(track_df$date) %>% as.Date()
第二步:按天聚合计算均值
现在有了正确的分组变量day,就可以用aggregate计算每日的平均距离和平均时间了(假设时间间隔列是dt,如果你的列名不同,记得替换):
基础R方法
# 单独计算平均距离 daily_mean_dist <- aggregate(dist ~ day, data = track_df, FUN = mean, na.rm = TRUE) # 单独计算平均时间间隔 daily_mean_time <- aggregate(dt ~ day, data = track_df, FUN = mean, na.rm = TRUE) # 或者一次性计算两个指标 daily_stats <- aggregate(cbind(dist, dt) ~ day, data = track_df, FUN = mean, na.rm = TRUE)
tidyverse/dplyr方法(更直观)
如果你熟悉tidyverse生态,用dplyr的管道语法会更清晰:
library(dplyr) daily_stats <- track_df %>% mutate(day = as.Date(date, format = "%d/%m/%Y %H.%M.%S")) %>% group_by(day) %>% summarise( mean_distance = mean(dist, na.rm = TRUE), mean_time_interval = mean(dt, na.rm = TRUE) )
为什么之前的代码会报错?
你之前写的by=list(traj[[1]]$date,"%d/%m/%Y")里,第二个元素是长度为1的字符串"%d/%m/%Y",而第一个元素是和数据行数一致的日期向量,两者长度不匹配,aggregate要求分组列表里的每个元素长度都要和数据行数相同,所以才会抛出arguments must have same length的错误。
内容的提问来源于stack exchange,提问作者NadiaN
相关产品推荐
相关产品推荐

