公共车站自行车分钟级数量序列及关联时间参数技术咨询
嘿,我看你已经在处理公共车站的自行车时序数据了,还贴心地加了any_change列来追踪下一次数量变化的剩余时间——这思路很棒!我来帮你梳理下这个数据集里关于「自行车取放剩余分钟数」的分析方向,还有一些实用的代码技巧~
数据集构建与输出
首先把你的数据集和处理代码整理清楚,方便后续分析:
# 初始数据集构建 num_biks <- data.frame( num_bikes = c(7, 7, 8, 8, 9, 9, 10, 8, 8, 7, 7, 9), mins_until_arrival = c(2, 1, 2, 1, 2, 1, 5, 4, 3, 2, 1, NA), mins_until_taken = c(7, 6, 5, 4, 3, 2, 1, 1, 1, NA, NA, NA) ) # 添加any_change列:距离下一次自行车数量变化的剩余分钟数 num_biks <- cbind(num_biks, any_change = unlist(lapply(rle(num_biks$num_bikes)$lengths, seq, by = -1))) # 查看最终数据集 num_biks
输出结果:
> num_biks num_bikes mins_until_arrival mins_until_taken any_change 1 7 2 7 2 2 7 1 6 1 3 8 2 5 2 4 8 1 4 1 5 9 2 3 2 6 9 1 2 1 7 10 5 1 1 8 8 4 1 2 9 8 3 1 1 10 7 2 NA 2 11 7 1 NA 1 12 9 NA NA 1
1. 先明确各个字段的核心含义
num_bikes:当前分钟车站的自行车实际数量mins_until_arrival:距离**下一辆自行车被放入(到达车站)**的剩余分钟数,NA表示当前没有已知的即将到达的自行车mins_until_taken:距离下一辆自行车被取走的剩余分钟数,NA表示当前没有已知的即将被取走的自行车any_change:你自定义的字段,通过rle()(游程编码)计算出的距离**任意数量变化(不管是取还是放)**的剩余分钟数
2. 围绕取放剩余分钟数的核心分析方向
2.1 匹配“特定变化”与“任意变化”,明确下一次变化类型
你可以通过对比mins_until_arrival/mins_until_taken和any_change的数值,判断每一分钟的下一次数量变化到底是来自自行车放入还是取走:
library(dplyr) num_biks <- num_biks %>% mutate(next_change_type = case_when( mins_until_arrival == any_change ~ "自行车放入", mins_until_taken == any_change ~ "自行车取走", TRUE ~ "未知变化" )) # 查看关键字段的对应关系 num_biks %>% select(num_bikes, any_change, mins_until_arrival, mins_until_taken, next_change_type)
比如第7行,any_change=1且mins_until_taken=1,对应下一分钟数量从10降到8,确实是自行车被取走,这个判断逻辑是成立的。
2.2 分析“无预期取放”的突发行为
看那些mins_until_arrival和mins_until_taken都是NA的行(比如第12行),此时any_change=1说明下一分钟数量会变化,但没有提前的取放预期——这类情况属于突发的取放行为,你可以统计这类情况的占比,或者看看这类变化的数量波动幅度:
# 统计突发变化的占比 sudden_change_ratio <- nrow(num_biks[is.na(num_biks$mins_until_arrival) & is.na(num_biks$mins_until_taken), ]) / nrow(num_biks) cat("突发取放行为占比:", round(sudden_change_ratio * 100, 2), "%\n") # 查看突发变化的数量波动 sudden_changes <- num_biks %>% filter(is.na(mins_until_arrival) & is.na(mins_until_taken)) %>% mutate(next_num_bikes = lead(num_bikes)) %>% select(num_bikes, next_num_bikes, any_change) sudden_changes
2.3 统计取放行为的时间间隔规律
通过分析mins_until_arrival和mins_until_taken的分布,你可以了解车站自行车补充和被取走的频率:
# 自行车放入行为的时间间隔统计 cat("自行车放入的时间间隔统计:\n") summary(num_biks$mins_until_arrival[!is.na(num_biks$mins_until_arrival)]) # 自行车取走行为的时间间隔统计 cat("\n自行车取走的时间间隔统计:\n") summary(num_biks$mins_until_taken[!is.na(num_biks$mins_until_taken)])
2.4 关联当前车量与取放剩余时间的关系
你可以探索当前自行车数量和取放剩余时间的相关性:比如车多的时候是不是更容易被取走(mins_until_taken更短),车少的时候是不是更容易有车补充(mins_until_arrival更短):
# 箱线图:当前车量 vs 取走剩余时间 boxplot(mins_until_taken ~ num_bikes, data = num_biks[!is.na(num_biks$mins_until_taken), ], main = "当前自行车数量 vs 距离下一次取走的剩余分钟数", xlab = "当前自行车数量", ylab = "剩余分钟数") # 箱线图:当前车量 vs 放入剩余时间 boxplot(mins_until_arrival ~ num_bikes, data = num_biks[!is.na(num_biks$mins_until_arrival), ], main = "当前自行车数量 vs 距离下一次放入的剩余分钟数", xlab = "当前自行车数量", ylab = "剩余分钟数")
3. 代码优化小技巧
你用rle()生成any_change的逻辑没问题,但可以用dplyr的窗口函数让代码更简洁易读:
num_biks <- num_biks %>% # 用游程编码分组,标记连续相同车量的时段 group_by(change_grp = with(rle(num_bikes), rep(seq_along(lengths), lengths))) %>% # 反向生成剩余变化分钟数 mutate(any_change = rev(row_number())) %>% ungroup() %>% select(-change_grp)
这样避免了lapply和unlist的嵌套,代码可读性更强~
内容的提问来源于stack exchange,提问作者cimentadaj

