標籤:

學習筆記-R語言實戰第4章

本章主要知識點:

1、操縱日期和缺失值

2、熟悉數據類型的轉換

3、變數的創建和重編碼

4、數據集的排序、合併與取子集

5、選入和丟棄變數

4.1 一個示例

#創建leadership數據框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)

4.2 創建新變數

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)/2attach(mydata)mydata$sumx<-x1+x2mydata$meanx<-(x1+x2)/2detach(mydata)mydata<-transform(mydata, sumx=x1+x2, meanx=(x1+x2)/2)

4.3 變數的重編碼

leadership$age[leadership$age==99]<-NA #將99歲的年齡值重編碼為缺失值leadership$agecat[leadership$age>75]<-"Elder"leadership$agecat[leadership$age>=55& leadership<=75]<-"Middle Aged"leadership$agecat[leadership$age<55]<-"Young"

更緊湊的寫法

leadership<- within(leadership,{ agecat<-NA agecat[age>75] <-"Elder" agecat[age>=55 & age<=75]<-"Middle Aged" agecat[age<55] <-"Young"})

4.4 變數的重命名

通過fix(leadership)調用一個互動式的編輯器

採用編程方式進行變數的重命名

#通過names()函數來重命名變數names(leadership)[2]<-"testDate" #重命名date為testDatenames(leadership)[6:10]<-c("item1","item2","item3","item4","item5")#將重命名q1到q5為item1到item5

使用plyr包中的rename()函數來進行重命名

install.packages("plyr")library(plyr)leadership<-rename(leadership, c(manager="managerID",date="testDate"))#使用rename修改變數名leadership

4.5 缺失值

#is.na()用於檢測缺失值是否存在y<-c(1,2,3,NA)is.na(y)[1] FALSE FALSE FALSE TRUE

#示例:使用is.na()函數is.na(leadership[,6:10]) q1 q2 q3 q4 q5[1,] FALSE FALSE FALSE FALSE FALSE[2,] FALSE FALSE FALSE FALSE FALSE[3,] FALSE FALSE FALSE FALSE FALSE[4,] FALSE FALSE FALSE TRUE TRUE[5,] FALSE FALSE FALSE FALSE FALSE

4.5.1 重編碼某些值為缺失值

leadership$age[leadership$age==99]<-NA #等於99的年齡值被修改為NA

4.5.2 在分析中排除缺失值

#用na.rm=TRUE 在計算之前移除缺失值並使用剩餘值進行計算x<-c(1,2,NA,3)y<-sum(x,na.rm=T)y6

#na.omit()可刪除所有含有缺失數據的行leadership managerID testDate country gender age q1 q2 q3 q4 q51 1 10/24/08 US M 32 5 4 5 5 52 2 10/28/08 US F 45 3 5 2 5 53 3 10/1/08 UK F 25 3 5 5 5 24 4 10/12/08 UK M 39 3 3 4 NA NA5 5 5/1/09 UK F NA 2 2 1 2 1newdata<-na.omit(leadership)newdata managerID testDate country gender age q1 q2 q3 q4 q51 1 10/24/08 US M 32 5 4 5 5 52 2 10/28/08 US F 45 3 5 2 5 53 3 10/1/08 UK F 25 3 5 5 5 2

4.6 日期值

#as.Date()將輸入R中的字元串,轉化為以數值形式存儲的日期變數#Sys.Date()可返回當天的日期,Date則返回當前的日期和時間

#Sys.Date() 可返回當天的日期,date() 則返回當前的日期和時間> Sys.Date() [1] "2017-02-25"> date()[1] "Sat Feb 25 23:20:20 2017"

> #使用函數format(x,format="output_format)來輸出指定格式的日期值,並可以提取日期值中的某些部分> today<-Sys.Date()> format(today,format="%B %d %Y") #非縮寫月份,數字表示的日期,四位數的年份[1] "二月 25 2017"> format(today,format="%A") #非縮寫的星期名[1] "星期六"

> #可在日期值上執行算術運算> startdate<-as.Date("2004-02-13")> enddate<-as.Date("2011-01-22")> days<-enddate-startdate> daysTime difference of 2535 days

> #用函數difftime()計算時間間隔> today<-Sys.Date()> dob<-as.Date("1956-10-12")> difftime(today,dob,units="weeks")Time difference of 3150.143 weeks

#猜猜作者生於星期幾> format(dob,format="%A")[1] "星期五"

4.6.1 將日期轉換為字元型變數

#as.character()可將日期值轉換為字元型

4.7 類型轉換

名為is.datatype()這樣的函數返回TRUE或FALSE,而as.datatype()這樣的函數則將參數轉換為對應的類型。

> a<-c(1,2,3)> a[1] 1 2 3> is.numeric(a)[1] TRUE> is.vector(a)[1] TRUE> a<-as.character(a)> a[1] "1" "2" "3"> is.numeric(a)[1] FALSE> is.vector(a)[1] TRUE> is.character(a)[1] TRUE

4.8 數據排序

#order()函數對一個數據框進行排序,默認的排序是升序,在排序變數前邊加一個減號即可得到降序的排序結果> attach(leadership)The following objects are masked _by_ .GlobalEnv: age, country, gender, q1, q2, q3, q4, q5> newdata<-leadership[order(leadership$gender,leadership$age),]> detach(leadership)> newdata # #各行依女性到男性、同樣性別中按年齡升序排序 managerID testDate country gender age q1 q2 q3 q4 q53 3 10/1/08 UK F 25 3 5 5 5 22 2 10/28/08 US F 45 3 5 2 5 55 5 5/1/09 UK F NA 2 2 1 2 11 1 10/24/08 US M 32 5 4 5 5 54 4 10/12/08 UK M 39 3 3 4 NA NA

#各行依經理人的性別和年齡降序排序> attach(leadership)The following objects are masked _by_ .GlobalEnv: age, country, gender, q1, q2, q3, q4, q5> newdata<-leadership[order(gender,-age),]> detach(leadership)> newdata managerID testDate country gender age q1 q2 q3 q4 q55 5 5/1/09 UK F NA 2 2 1 2 12 2 10/28/08 US F 45 3 5 2 5 53 3 10/1/08 UK F 25 3 5 5 5 24 4 10/12/08 UK M 39 3 3 4 NA NA1 1 10/24/08 US M 32 5 4 5 5 5

4.9 數據集的合併

4.9.1 向數據框添加列

#橫向合併兩個數據框,使用merge()函數total<-merge(dataframeA,dataframeB,by="ID")#直接橫向合併兩個矩陣或數據框,且不需要指定一個公共索引,可直接用cbind()函數total<-cbind(A,B)

4.9.2 向數據框添加行

#縱向合併兩個數據框,使用rbind()函數total<-rbind(dataframeA,dataframeB)

4.10 數據集取子集

4.10.1 選入變數

newdata<-leadership[,c(6:10)]newdata #從leadership數據框中選擇了變數q1,q2,q3,q4和q5,並將它們保存到了數據框newdata中

使用paste()函數創建了與上例中相同的字元型向量

> myvars<-paste("q",1:5,sep="")> newdata1<-leadership[myvars]> newdata1 q1 q2 q3 q4 q51 5 4 5 5 52 3 5 2 5 53 3 5 5 5 24 3 3 4 NA NA5 2 2 1 2 1

4.10.2 剔除變數

#剔除變數q3和q4myvars<-names(leadership) %in% c("q3","q4")newdata<-leadership[!myvars]

1 names(leadership)生成了一個包含所有變數名的字元型向量:c("managerID","testDate","country","gender","age","q1","q2","q3","q4","q5")

2 names(leadership) %in% c("q3","q4")返回了一個邏輯型向量,names(leadership)中每個匹配q3或q4的元素的值為TRUE,反之為FALSE:c(FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,FALSE).

3 運算符非(!)將邏輯值反轉:c(TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE).

4 leadership[c(TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE)]選擇了邏輯值為TRUE的列,於是q3和q4被剔除了。

當知道q3和q4是娜依列時,可通過如下代碼實現。

newdata<-leadership[c(-8,-9)]

也可通過以下方式完成

leadership$q3<-leadership$q4<-NULL

4.10.3 選入觀測

newdata<-leadership[1:3,] #選擇第1行到第3行newdata<-leadership[leadership$gender=="M"& leadership$age>30,] #選擇30歲以上的男性attach(leadership)newdata<-leadership[gender=="M"&age>30,]detach(leadership)#使用attach()函數,就不用再變數名前加數據框名稱了

#將研究範圍限定在2009年1月1日到2009年12月31日之間leadership$date<-as.Date(leadership$date,"%m/%d/%y")#將開始作為字元值讀入的日期轉換為日期值startdate<-as.Date("2009-01-01")#創建開始日期enddate<-as.Date("2009-10-31")#創建結束日期newdata<-leadership[which(leadership$date>=startdate& leadership$date<=enddate),]

4.10.4 subset()函數

採用subset()函數來選擇變數和觀測

newdata<-subset(leadership,age>=35|age<24, select=c(q1,q2,q3,q4)) #選擇所有age值大於等於35或age值小於24的行,保留變數q1到q4newdatanewdata<-subset(leadership,gender=="M"&age>25, select=gender:q4) #選擇所有25歲以上的男性,並保留變數gender到q4的列

4.10.5 隨機抽樣

#sample()函數能夠讓你從數據集中抽取大小為n的一個隨機樣本#從leadership數據集中隨機抽取一個大小為3的樣本mysample<-leadership[sample(1:nrow(leadership),3,replace=F)]#無放回抽樣

推薦閱讀:

第14章 字元串
在《one.一個》改版前,你一直念念不忘的文章是哪篇?
全棧 - 13 ggplot2 在 R 中進行可視化
大連市2016年空氣質量數據可視化
R語言可視化——數據地圖離散百分比填充(環渤海)

TAG:R | R编程语言 |