R语言第五次实训,dplyr 、tidyr和lubridate处理数据

2 篇文章 0 订阅

题目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排序。
Notebook中展示输出结果为
head(trade.metro.in.out,10)
并输出本地文件
shmetro_line_in_out.csv

解决:

读数据:

setwd("E://table")
library(data.table)
dt=fread('SY-20150401.csv')

重命名:

names(dt)<-c('card_id','date','time','station','vehicle','money','property')
dt

选取是地铁的数据

sy<-dt[dt$vehicle=='地铁',]
sy

将station分成2个字段line和station,利用‘号线’来分割;处理每5分钟一段,并按M5排序(化为秒÷300向上取整)

library(dplyr)
library(tidyr)
sy_split<-subset(sy,select = c(card_id,time,station,money),na.rm=TRUE)
sy_split<-separate(sy_split,'station',c('line','station'),'号线',remove=TRUE)
sy_split$M5<-ceiling((lubridate::period_to_seconds(lubridate::hms(sy_split$time)))/300)
sy_split<-sy_split[order(sy_split$M5)]
sy_split

统计进站数据

trade.metro.in <- subset(sy_split,money==0,select=-c(money))
names(trade.metro.in)<-c('card.id','time.in','line.in','station.in','M5.in')
trade.metro.in

统计出站数据

trade.metro.out<-sy_split[money>0]
names(trade.metro.out)<-c('card.id','time.out','line.out','station.out','money','M5.out')
trade.metro.out

根据card.id将5和6合并;并计算乘车时长;将乘车时长大于0的取出来

trade.metro.in.out<-merge(trade.metro.in,trade.metro.out,by=c('card.id'))
trade.metro.in.out$duration=lubridate::period_to_seconds(lubridate::hms(trade.metro.in.out$time.out))-lubridate::period_to_seconds(lubridate::hms(trade.metro.in.out$time.in))
trade.metro.in.out<-subset(trade.metro.in.out,duration>0)
trade.metro.in.out

通过card.id, M5.in来统计出某个card.id的最短的乘车时长
然后通过duration==duration_min,将最近出站时间,找出来
再将中间的统计量去掉,也可以dplyr中的管道%>%实现

trade.metro.in.out[,duration.min:=min(duration),by=.(card.id,M5.in)]
trade.metro.in.out
trade.metro.in.out<-subset(trade.metro.in.out,duration==duration.min,select = -c(duration.min))
trade.metro.in.out

按照card.id来排序,并展示前10条

trade.metro.in.out<-trade.metro.in.out[order(card.id),]
head(trade.metro.in.out,10)

将处理后的数据输出

write.csv(trade.metro.in.out,'shmetro_line_in_out.csv',row.names = FALSE)

利用1中的处理结果,按照station.in,station.out来分组,统计各组的数量
按照进出站的流量排序,取出前10个
展示前6个

cus_nums<-trade.metro.in.out[,.(cusnums=.N),by=.(station.in,station.out)]
cus_nums<-cus_nums[order(cusnums,decreasing = TRUE)]
cus_nums<-cus_nums[0:10,]
head(cus_nums,6)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值