首页 > > > R语言实战-第三讲实践
首先过一遍猴哥第三讲的实践案例,大体分为两个部分:数据预处理和数据分析。
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)


还有一个问题没有解决就是“%U”代表什么?在书上和网上都暂时还没有找到答案,留待解决。
因为这次的实践作业要求找一份日常工作中的数据来进行简单的处理和分析,可能是我找数据的方法不太对,在网上搜索了半天都没有找到一份合适的数据,最后决定就用我之前学习Excel时候的数据来练习吧。以下两份练习数据均是学习Excel时课程附带的数据,因为数据比较杂乱,只能做非常简单的分析,但是用来练习数据的预处理还是足够的。
1).服装市场价格

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的数据框长这样:

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


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,看一下前面的观测可知是因为被加和的数据中有一些无法转成数值类型:

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/ ,如需转载,请注明出处,否则将追究法律责任。