R语言入门第六集 实验五:综合应用
一、资源
【R语言】沈阳地铁数据处理及站间流量统计——R语言第五次实训
R语言中data.Table中的{ . .N := keyby }
R读数据stringsAsFactors=F,存数据时row.names = F
二、答案更新纠正
原答案中的第一、二题并无更新,不在此处另作篇幅叙述。
三、答案
实验五 综合应用
题目1:
1.1数据处理【只用SY-20150401.csv】
统计每5分钟,各站点的进出站流量(说明:00:00:01在第一个5分钟内,00:10:13在第三个5分钟内),由于一天可能多次乘坐地铁,根据卡号和进站时间,查询最近出站的时间,作为本次出站时间。参考函数lubridate::hms,lubridate::period_to_seconds。处理的最终结果:dataframe(名称trade.metro.in.out)
字段 字段说明
card.id 卡 id
time.in 进站时间
line.in 进站线路
station.in 进站站点
M5.in 第几个 5 分钟进站
time.out 出站时间
line.out 出站线路
station.out 出站站点
money 票价
M5.out 第几个 5 分钟出站
duration 乘坐时间(单位:秒)
提交的表格按照 card.id排序。Notebook中展示输出结果为head(trade.metro.in.out,10),并输出本地文件 shmetro_line_in_out.csv
library(tidyr)
library(dplyr)
library(lubridate)
df <-read.csv("SY-20150401.csv")
colnames(df) <- c('card.id','date','time','station','vehicle','money','property')
trade.metro<-separate(df ,station, c('line', 'station'), sep = '号线')
trade.metro <- trade.metro %>% mutate(M5=ceiling(period_to_seconds(hms(time))/300))
trade.metro.in <- trade.metro %>% filter(money==0) %>% select(card.id,"time.in"=time,"line.in"=line,"station.in"=station,"M5.in"=M5)
trade.metro.out <- trade.metro %>% filter(money>0) %>% select(card.id,"time.out"=time,"line.out"=line,"station.out"=station,money,"M5.out"=M5)
trade.metro.in.out <- merge(trade.metro.in, trade.metro.out, by = "card.id") %>% mutate(duration = (period_to_seconds(hms(time.out)) - period_to_seconds(hms(time.in)))) %>% filter(duration > 0)
trade.metro.in.out <- data.table(trade.metro.in.out)
trade.metro.in.out[, duration_min := min(duration), by=list(card.id, M5.in)]
trade.metro.in.out <- trade.metro.in.out %>% filter(duration==duration_min) %>% select(-duration_min)
trade.metro.in.out<-trade.metro.in.out[order(trade.metro.in.out$card.id),]
trade.metro.in.out<-as.data.frame(trade.metro.in.out)
class(trade.metro.in.out)
head(trade.metro.in.out,10)
write.csv(trade.metro.in.out,"shmetro_line_in_out.csv",row.names = F)
题目2:
2.1统计进站与出站之间的流量
通过题目1中的dataframe(trade.metro.in.out)进行统计,统计进站与出站之间的流量;然后选取流量最大的前10个站点,在Notebook中查看前6条。注意提交内容要包括处理后的shmetro_line_in_out.csv,与源码放在一起 。
trade.metro.in.out <- data.table(trade.metro.in.out)
flow <- trade.metro.in.out[,.(passenger.flow=.N), keyby=.(station.in,station.out)]
flow<-flow[order(flow$passenger.flow,decreasing = TRUE),]
result2<-flow[1:10,]
head(result2,6)