走進R語言的世界——簡單數據處理

近期要連續出差,這幾天加上周末除了整理出差資料就是在學習R語言,終於按期完成學習任務。前面第一、二章的學習可以算是入門和熟悉,這期簡單數據處理則正式開始用R語言進行實戰了。因此本關的筆記廢話不敘,直奔主題。

1、書本基本數據管理實操練習

(1)生成一個數據框示例

manager <- c(1,2,3,4,5)date <- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")country <- c("US","US","UK","UK","UK")gender <- c("M","F","F","M","F")age <- c(32,45,25,39,99)q1 <- c(5,3,3,3,2)q2 <- c(4,5,5,3,2)q3 <- c(5,2,5,4,1)q4 <- c(5,5,5,NA,2)q5 <- c(5,5,2,NA,1)leadership <- data.frame(manager,date,country,gender,age,q1,q2,q3,q4,q5,stringsAsFactors = FALSE)

(2)創建新變數的3種方法

#第一種方法mydata <- data.frame(x1 = c(2,2,6,4),x2=c(3,4,2,8))mydata$sumx <- mydata$x1 + mydata$x2mydata$meanx <- (mydata$x1 + mydata$x2)/2#第二種方法attach(mydata)mydata$sumx <- x1 + x2mydata$meanx <- (x1 + x2)/2detach(mydata)#第三種方法mydata <- transform(mydata,sumx=x1 + x2,meanx=(x1 + x2)/2)

(3)變數重編碼的2種方法

#變數的重編碼(1)leadership$age[leadership$age == 99] <- NAleadership$agecat[leadership$age > 75] <- "Elder"leadership$agecat[leadership$age >= 55 & leadership$age <= 75] <- "Middle Aged"leadership$agecat[leadership$age < 55] <- "Young"#變數的重編碼的緊湊寫法(2)leadership <- within(leadership,{ agecat <-NA agecat[age > 75] <- "Elder" agecat[age >=55 & age <=75] <- "Middle Aged" agecat[age < 55] <- "Young" })

(4)變數重命名的3種方法

#變數的重命名(1)fix(leadership)#變數的重命名(2)names((leadership))names(leadership)[2] <- "testdate"leadership#變數的重命名(3)install.packages("plyr")library(plyr)leadership <- rename(leadership, c(manager="managerID",date="testdate"))

(5)缺失值的檢測和排除

#缺失值的檢測is.na(leadership[,6:10])#在分析中排除缺失值leadershipnewdata <- na.omit(leadership)

(6)日期格式轉化

#日期格式轉化myformat <- "%m/%d/%y"leadership$testdate <- as.Date(leadership$testdate,myformat)leadership

(7)數據集的選入和剔除

#數據的升序和降序排序newdate2 <- leadership[order(leadership$age),]newdate2newdata3 <- leadership[order(-age),]newdata3#數據集中取子集myvars <- c("q1","q2","q3","q4","q5")newdata4 <- leadership[myvars]newdata4#剔除數據集中的部分變數myvars1 <- names(leadership) %in% c("q3","q4")newdata1 <- leadership[!myvars1]newdata5 <- leadership[c(-8,-9)] #知道被剔除的變數是第幾列情況下newdata5

(8)圖形初階實踐

dose <- c(20,30,40,45,60)drugA <- c(16,20,27,40,60)drugB <- c(15,18,25,31,40)#直接鍵入值修改圖形繪製參數plot(dose,drugA,type="b",lty=3,lwd=3,pch=15,cex=2)#使用plot()和par()組合函數修改圖形參數plot(dose,drugA,type = "b")opar <- par(no.readonly = TRUE)par(lty=2,pch=17)plot(dose,drugA,type="b")par(opar)#灰度顏色圖形繪製n <- 10mycolors <- rainbow(n)pie(rep(1,n),labels=mycolors,col=mycolors)mygrays <- gray(0:n/n)pie(rep(1,n),labels=mygrays,col=mygrays)

2、朝陽醫院Excels數據實踐練習

(1)Excels數據的導入

#讀入Excels數據install.packages("openxlsx")library(openxlsx)readFilepath <- "G:/大數據作業實踐和有用資料/第三關作業實踐/課件源代碼和數據/朝陽醫院2016年銷售數據.xlsx"excelData <- read.xlsx(readFilepath,1)

(2)數據的預處理

##………………………………………………………………………………數據預處理階段#列名重命名names(excelData) <- c("time","cardno","drugld","drugName","saleNumber","virtualmoney","actualmoney")excelData1 <- excelData[!is.na(excelData$time),]#安裝stringr包並對time列截取出年月日部分install.packages("stringr")library(stringr)timesplit <-str_split_fixed(excelData1$time," ",n=2)excelData1$time <- timesplit[,1]#轉化成日期數值類型fix(excelData1) #查看導入後的excelData1中數據存儲類型excelData1$time <- as.Date(excelData1$time,"%Y-%m-%d")class(excelData1$time)excelData1$saleNumber <- as.numeric(excelData1$saleNumber)excelData1$virtualmoney <- as.numeric(excelData1$virtualmoney)excelData1$actualmoney <- as.numeric(excelData1$actualmoney)#按銷售時間進行排序excelData1 <- excelData1[order(excelData1$time,decreasing = FALSE),]

(3)月均消費次數統計

###月均消費次數統計——————第一項任務kpi1 <- excelData1[!duplicated(excelData1[,c("time","cardno")]),]consumeNumber <- nrow(kpi1)consumeNumberstartTime <- kpi1$time[1]endTime <- kpi1$time[nrow(kpi1)]day <- endTime - startTimeclass(day)day <- as.numeric(day)month <- day %/% 30monthConsume <- consumeNumber %/% monthmonthConsume

(4)月均消費金額計算

###月均消費金額計算——————第二項任務totalMoney <- sum(excelData1$actualmoney,na.rm = TRUE)monthMoney <- totalMoney / monthmonthMoney

(5)客單價統計

###客單價----------——————第三項任務pct <- totalMoney /consumeNumberpct <- round(pct,2)pct

(6)消費趨勢圖形繪製和最終趨勢圖

###消費趨勢--------——————第四項任務week <- tapply(excelData1$actualmoney, format(excelData1$time,"%Y-%U"), sum)week <- as.data.frame.table(week)weeknames(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", main="2016年朝陽醫院消費曲線", col="blue", type="b")axis(1,at=week$timeNumber,labels = week$times,cex.axis=1.5)

3、幾點心得和體會

(1)學習時將遇到函數列表統計,後期再用到某函數時直接從列表中翻看其用法和功能,省去拿書翻找的時間,方便高效。

(2)代碼的目的是實現最終想法,但寫法可以是不拘一格、風格迥異的,發現這也是學編程的一大樂趣。

(3)函數的熟練應用和代碼編寫細節(如「[]」的應用)仍需邊實踐邊加強鞏固。

(4)有些函數功能無法使用,首先要檢查其功能支持包是否安裝,再查看哪些地方出錯。

按照猴子老師的思路和給出的函數,照貓畫虎的成功運行出結果,可見自己要想獨立解決問題還是「路漫漫其修遠兮」。但回看身後,出發的起點已經漸漸模糊,已經在漫漫的征途之中了,在自我成長的路上唯有快馬加鞭,奮力向目標賓士了。

這關學習很辛苦,自己給自己兌現獎勵了。^_^ ^_^ ^_^


推薦閱讀:

程序化廣告實戰分享系列 – PDB之坑(二)
個性化-第一章《續》

TAG:R编程语言 | 数据处理 | 大数据 |