R处理Divvy骑行数据调用filter筛选时报错starttime未找到求助
问题原因
报错的核心原因是列选择逻辑错误:你在select(trip, usertype)步骤仅保留了usertype一列,后续filter()需要用到的starttime、stoptime,以及分组用到的starttime都已经被移除,因此触发找不到对象的报错。
修正后代码
library(tidyverse) library(lubridate) # 需提前加载该包才能正常调用hour、wday函数 divvy_trips <- c("divvy_trips_2013","divvy_trips_2014_Q1Q2","divvy_trips_2014_Q3_07","divvy_trips_2014_Q3_0809","divvy_trips_2014_Q4","divvy_trips_2015_Q1","divvy_trips_2015_Q2","divvy_trips_2015_07","divvy_trips_2015_08","divvy_trips_2015_09","divvy_trips_2015_Q4","divvy_trips_2016_Q1","divvy_trips_2016_04","divvy_trips_2016_05","divvy_trips_2016_06","divvy_trips_2016_Q3","divvy_trips_2016_Q4","divvy_trips_2017_Q1","divvy_trips_2017_Q2","divvy_trips_2017_Q3","divvy_trips_2017_Q4","divvy_trips_2018_Q1","divvy_trips_2018_Q2","divvy_trips_2018_Q3","divvy_trips_2018_Q4","divvy_trips_2019_Q1","divvy_trips_2019_Q2","divvy_trips_2019_Q3","divvy_trips_2019_Q4") divvy_trip_days=NULL for(i in divvy_trips){ trip<-eval(parse(text=i)) # 新增stoptime字段存在校验,避免部分数据集缺字段时报错 if ("starttime" %in% names(trip) & "stoptime" %in% names(trip)){ trip<-trip %>% # 先做筛选、分组、聚合,处理完成后再按需保留字段 filter(((hour(starttime) >=6 & hour(stoptime) >=6) & (hour(starttime)<=10 & hour(stoptime) <=10)) |((hour(starttime) >=16& hour(stoptime) >=16)& (hour(starttime)<=20 & hour(stoptime) <=20)))%>% group_by(usertype,what_day = wday(starttime))%>% summarise(count=n(), .groups = "drop") # 新增参数关闭分组警告 } divvy_trip_days <- rbind(divvy_trip_days,trip) print(i) }
可优化建议
- 可以把所有数据集提前存入同一个列表处理,替代
eval(parse())的写法,逻辑更安全也更易调试 - 可以用
purrr::map_dfr()代替for循环+rbind的写法,自动完成多数据集结果拼接,代码更简洁 - 可以先统一校验所有数据集的字段格式、时间字段类型,避免中途出现类型转换报错
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

