前面四章講到了R和Rstudio的安裝,Rstudio的基本使用方法,各種數(shù)據(jù)的導(dǎo)入和導(dǎo)出、R語(yǔ)言數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),如果你已經(jīng)較為熟練的掌握了R的這些基本知識(shí),你們現(xiàn)在就可以正式開始我們的數(shù)據(jù)分析工作了。
數(shù)據(jù)分析包括數(shù)據(jù)的采集、處理、分析、可視化。
這一章主要講解數(shù)據(jù)分析的第二步——數(shù)據(jù)處理。數(shù)據(jù)處理是每一個(gè)數(shù)據(jù)分析師拿到數(shù)據(jù)所做的第一步。因?yàn)閹缀鯖]有一份數(shù)據(jù)到我們的手中時(shí),所有的內(nèi)容都是我們滿意的,而且處理后的數(shù)據(jù)即相當(dāng)于從大量信息中剔除噪音,讓我們獲取更多的信息。
我推薦《R語(yǔ)言實(shí)戰(zhàn)》這本書作為新手的入門書,里面的內(nèi)容很詳細(xì),適合新手學(xué)習(xí)。
我對(duì)于簡(jiǎn)單數(shù)據(jù)處理的思路分為7塊,分別是數(shù)據(jù)概覽、修改、添加、刪除、排序、合并、選入觀測(cè)。
1、數(shù)據(jù)概覽
在拿到數(shù)據(jù)之前第一步要做的就是概覽數(shù)據(jù)
head(df,n=10)#查看數(shù)據(jù)集的前十條記錄
str(df)#查看數(shù)據(jù)集結(jié)構(gòu)
tail(df)#查看數(shù)據(jù)集最后部分
sapply(df)#查看數(shù)據(jù)集類型及名稱
summary(df)#查看數(shù)據(jù)集各變量描述統(tǒng)計(jì)
……
供練習(xí)數(shù)據(jù)集
name1 <- c("Bob","Mary","Jane","Kim")
name2 <- c("Bob","Mary","Kim","Jane")
weight <- c(60,65,45,55)
height <- c(170,165,140,135)
birth <- c("1990-1","1980-2","1995-5","1996-4")
accept <- c("no","ok","ok","no")
df1 <- data.frame(name1,weight,height)
df2 <- data.frame(name2,birth,accept,stringsAsFactors = F)
2、數(shù)據(jù)修改
數(shù)據(jù)修改主要包括變量的重編碼、重命名,數(shù)據(jù)格式的改變,數(shù)據(jù)位置的調(diào)整,
2.1變量的重編碼
1)將df1中Kim的身高改為165
df1$height[name1=='Kim] <- 165
2)將體重按定性變量定義,小于等50kg為thin,51到60kg為normal,大于60kg為fat
df1$weight[weight <= 50] <- 'thin'
df1$weight[weight > 50 & weight <=60] <- 'normal'
df1$weight[weight > 60] <- 'fat'
2.2變量的重命名
為了方便處理、或是更好的表示數(shù)據(jù)特征,我們需要更改變量名稱,常用函數(shù)為names()
names(df1)#查看所有變量名
names(df1)[2] <- 'size'#把變量‘weight’改為‘size’
2.3更改數(shù)據(jù)格式、類型
1)更改日期格式
日期格式的默認(rèn)格式為yyyy-mm-dd
Sys.Date()#查看系統(tǒng)日期
today <- Sys.Date()
format(today,"%d %a %b")#輸出格式為[1] "2017-06-20"這是我的寫作日期,將日期格式修改為%d %a %b
補(bǔ)充:format()可以用于轉(zhuǎn)換數(shù)據(jù)格式,包括小數(shù)、科學(xué)計(jì)算方法等等。
2)更改更多數(shù)據(jù)類型

is.datatype()函數(shù)查詢數(shù)據(jù)類型,返回TRUE或FALSE。而as.datatype()函數(shù)則轉(zhuǎn)換為對(duì)應(yīng)的類型。
3)缺失值處理
is.na(df1$weight)#判斷缺失值
df1$weight <-NA#改為缺失值
data=data.frame(y=c(1,2,3,NA,5,6),x1=c(6,NA,4,3,2,1),x2=c(1,3,6,9,12,NA))
attach(data)
y[is.na(y)]=mean(y,na.rm=T)
x1[is.na(x1)]=mean(x1,na.rm=T)
x2[is.na(x2)]=mean(x2,na.rm=T)
data=data.frame(y,x1,x2)#把缺失值修改為平均值
3.數(shù)據(jù)的添加
數(shù)據(jù)的添加包括添加字段(變量)、記錄
1)添加變量(列)
df2 <- transform(df1,BMI=weight/height^2)#第一種方法
df1$BMI <- df1$weight/df1$height^2#第二種方法
2)添加記錄(行)
添加記錄在R中較麻煩,需要新建數(shù)據(jù)框,合并原有數(shù)據(jù)框,放在合并那塊細(xì)講。
4.數(shù)據(jù)的刪除
數(shù)據(jù)的刪除包括刪除字段、記錄、缺失值等
1)刪除字段(列)
df2[-c(2,4)]
df2[c(-2,-4)]
df2[c(T,F,T,F)]
以上方式皆相同,都為直接刪除列
df2$weight <- df2$BMI <-NULL#將列定義為缺失值,從而刪除列
%in%表示返回邏輯型向量,出df2中的birth、accept為F,其他皆為T
myvars <- names(df2) %in% c('birth','accept')
df2 <- df2[!myvars]#!表示相反
2)刪除記錄(行)
df2[!accept=='no',]#刪除含特定值的行,這里講不接受的人刪除
3)刪除含缺失值的行
na.omit()后者
5.數(shù)據(jù)的排序
1)R自帶函數(shù)的排序方法
df1[order(df1$weight),]#升序
df1[order(-df1$height),]#降序
df3 <- data.frame(name1,weight,height,accept,stringsAsFactors=F)
df3[order(df3$accept,df3$weight),]#按照是否接受進(jìn)行體重升序
2)dplyr包排序方法
library(dplyr)
arrange(df3,accept,weight)#按照是否接受進(jìn)行升序
6.合并數(shù)據(jù)集
1)合并merge()
merge(df1,df2,by='name1') #按name1,合并df1、df2
merge(df1,df2,by='name1',all=T) #保留缺失值
另外還有兩種常見的合并函數(shù):行合并rbind(),列合并cbind()
dplyr包高效合并
bind_rows(df1,df2)#區(qū)別rbind(df1,df2)
bind_cols(df1,df2)
2)整合aggregate()
aggregate(df,by=list(col1,col2…),FUN)#根據(jù)col1、col2的變量添加FUN函數(shù),整合數(shù)據(jù)框。
3)重鑄reshape()
'''names(airquality) <- tolower(names(airquality))
View(airquality)
aqm <- melt(airquality,id=c("month","day"),na.rm = T)#融合,na.rm=T不顯示空值
aqm1 <- melt(airquality,id=c("month","day"),na.rm = F)#顯示空值
dcast(aqm,day+variable~month)#重鑄,R語(yǔ)言實(shí)戰(zhàn)第五章P.107
dcast(aqm,variable+day~month)
dcast(aqm,day~variable+month)
dcast(aqm,day~month,mean)#計(jì)算變量variable均值
dcast和acast用法相似,dcast會(huì)把分組信息作為一列或者幾列顯示,acast會(huì)將其作為行名
dcast(aqm,variable+month~day)
acast(aqm,variable+month~day)
acast(aqm,day~month,mean)
acast(aqm,variablemonthday)#生成一個(gè)三維矩陣,按照day分成31個(gè)矩陣
install.packages('tidyr')'''
用的很少,這里就幾個(gè)例子,下次遇到再補(bǔ)充。
7.選入觀測(cè)
1)觀測(cè)特定列
df1[,c(1,2)]
2)觀測(cè)特定行
subset(df1,df1$weight>=50|df1$weight<=60,select = c('name1'))