ITPub博客

首页 > > > R语言实战-第三讲实践

R语言实战-第三讲实践

作者:浪花小雨滴 时间:2020-06-16 15:30:20 0 删除 编辑

1.朝阳医院销售数据


首先过一遍猴哥第三讲的实践案例,大体分为两个部分:数据预处理和数据分析。

1).数据预处理:列名重命名、删除缺失数据的观测、处理日期格式、数据类型转换、数据排序。代码如下:

library("stringr")
library("openxlsx")
readfilePath<-"C:/Users/21/Desktop/朝阳医院2016年销售数据.xlsx"
excelData<-read.xlsx(readfilePath,"Sheet1")
excelData<-na.omit(excelData)
names(excelData)<-c("time","cardno","drugID","drugName","saleNumber",
                    "virtualMoney","actualMoney")
timeSplit<-str_split_fixed(excelData$time," ",n=2)
excelData$time<-timeSplit[,1]
class(excelData$time)
excelData$time<-as.Date(excelData$time,"%Y-%m-%d")
class(excelData$time)
excelData$saleNumber<-as.numeric(excelData$saleNumber)
excelData$virtualMoney<-as.numeric(excelData$virtualMoney)
excelData$actualMoney<-as.numeric(excelData$actualMoney)
excelData<-excelData[order(excelData$time),]

2).数据分析:

  • 月均消费次数=总消费次数/月份数

> kip1<-excelData[!duplicated(excelData[,c("time","cardno")]),]
> consumerNumber<-nrow(kip1)
> startTime<-kip1$time[1]
> endTime<-kip1$time[nrow(kip1)]
> day<-endTime-startTime
> day<-as.numeric(day)     #从difftime类型转为numeric
> month<-day%/%30
> monthConsume<-consumerNumber/month
> monthConsume     #月均消费次数
[1] 899.6667

其中duplicated()函数可以挑选出重复值,并返回一个逻辑向量。

  • 月均消费金额=总消费金额/月份数

> totalMoney<-sum(excelData$actualMoney,na.rm = TRUE)
> monthMoney<-totalMoney/month
> monthMoney       #月均消费金额
[1] 50771.71
  • 客单价=总消费金额/总消费次数

> pct<-totalMoney/consumerNumber
> pct              #客单价
[1] 56.43391
  • 消费趋势

week<-tapply(excelData$actualMoney,format(excelData$time,"%Y-%U"),sum)  #%U怎么用?
week<-as.data.frame.table(week)
names(week)<-c("time","actualMoney")
week$time<-as.character(week$time)
week$timeNumber<-c(1:nrow(week))
plot(week$timeNumber,week$actualMoney,
     xlab = "时间(年份-第几周)",
     ylab = "消费金额",
     xaxt = "n",        #禁用x坐标轴
     main= "2016年朝阳医院消费金额",
     col="blue",
     type="b")
axis(1,at=week$timeNumber,labels = week$time,cex.axis=1.5)

其中tapply()函数用来进行分组统计,理解tapply函数花了一些时间,在网上找到一遍博文对tapply和其相关函数有比较好的解释,下面附上链接和图片:R中利用apply、tapply、lapply、sapply、mapply、table等函数进行分组统计_菜鸟的成长_新浪博客

还有一个问题没有解决就是“%U”代表什么?在书上和网上都暂时还没有找到答案,留待解决。

2.练习数据

因为这次的实践作业要求找一份日常工作中的数据来进行简单的处理和分析,可能是我找数据的方法不太对,在网上搜索了半天都没有找到一份合适的数据,最后决定就用我之前学习Excel时候的数据来练习吧。以下两份练习数据均是学习Excel时课程附带的数据,因为数据比较杂乱,只能做非常简单的分析,但是用来练习数据的预处理还是足够的。

1).服装市场价格

首先导入Excel文件,对每列变量进行重命名:

library("stringr")
library("openxlsx")
readfilePath<-"C:/Users/21/Desktop/练习数据.xlsx"
excelData<-read.xlsx(readfilePath,"1-日期格式错误")
names(excelData)<-c("Time","ProductName","MarketPrice","DiscountPrice",
                    "DiscountRate","AdvisoryReason")

删除掉缺失数据的观测:

excelData<-na.omit(excelData)

把数据框中的日期转为日期格式:

excelData$Time<-as.Date(excelData$Time,"%Y.%m.%d")

转化后日期默认格式是“%Y-%m-%d”,所以可用“-”作为分隔符将年月日分开:

Timesplit<-str_split_fixed(excelData$Time,"-",n=3)
excelData$Year<-Timesplit[,1]
excelData$Month<-Timesplit[,2]
excelData$Day<-Timesplit[,3]

按时间排序:

excelData<-excelData[order(excelData$Time),]

最后简单统计一下表格里公记录了多少个月的数据:

> kip1<-excelData[!duplicated(excelData[,c("Year","Month")]),]
> monthNumber<-nrow(kip1)
> monthNumber
[1] 15

这里kip1的数据框长这样:

因为之前把日期的年月日都分开了,所以可以用年和月两列变量作duplicated()函数的参数,选出所有年月不重复的数据,可以看最左侧的Time变量,最后统计出来的就是每月第一天的观测,最后用nrow()就可以计算总的月数是多少。

2).奥运会历届奖牌记录

这次的数据处理起来有点麻烦,首先是队伍一列,每个国家名字前都有一个空格,直接导入R的话这个空格会变成一段乱码,而且奇怪的是这里的空格在Excel里不能用查找替换的方法消除。所以我在Excel里采用了分列的方法来消除空格“数据-分列-固定宽度”,这样就可以将队伍前的空格和文字部分分成两列,删除空格一列即可得到规范的数据。

接下来将文件导入R,并重命名:

library("openxlsx")
pathway<-"C:/Users/21/Desktop/练习数据.2.xlsx"
OlympicData<-read.xlsx(pathway,"历届奖牌记录表")
OlympicData<-na.omit(OlympicData)
names(OlympicData)<-c("Event","Time","Ranking","Team","Code","GoldMedal",
                      "SilverMedal","BronzeMedal","HeldCity","HeldCountry")

我将Excel中的奖牌总数一列删掉,准备用R重新计算一遍,但是发现一些加和后的值为NA,看一下前面的观测可知是因为被加和的数据中有一些无法转成数值类型:

通过以下代码用“0”来替换掉“-”再进行计算即可:

OlympicData$GoldMedal[OlympicData$GoldMedal=="-"]<-0
OlympicData$SilverMedal[OlympicData$SilverMedal=="-"]<-0
OlympicData$BronzeMedal[OlympicData$BronzeMedal=="-"]<-0

OlympicData$GoldMedal<-as.numeric(OlympicData[,6])
OlympicData$SilverMedal<-as.numeric(OlympicData[,7])
OlympicData$BronzeMedal<-as.numeric(OlympicData[,8])

OlympicData<-transform(OlympicData,Sum=GoldMedal+SilverMedal+BronzeMedal)

最后用duplicated()函数计算表中共有多少不同参赛队伍:

> kip2<-OlympicData[!duplicated(OlympicData[,c("Team")]),]
> TotalTeamNumber<-nrow(kip2)
> TotalTeamNumber    #the number of countries that have joined olympic
[1] 144
> 

经过一系列简单的处理和分析之后感觉目前所学的数据处理方式还十分有限,例如难以进行列方向上的分类统计,以及难以从数据框中挑选特定行数据,希望能进一步学习更多的分析方法。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3146088/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Docker (一) 安装
请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39969