R语言学习笔记(4)
第四章:基本數據管理
一 貫穿整章的示例
二 變量的創建、重編碼和重命名
三 日期值與缺失值
四 數據類型和類型轉換
五 數據集的排序、合并與取子集
?
一 貫穿整章的示例(leadership)?
代碼4-11 > manager<-c(1,2,3,4,5) 2 > date<-c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09") 3 > country<-c("us","us","uk","uk","uk") 4 > gender<-c("m","f","f","m","f") 5 > age<-c(32,45,25,39,99) 6 > q1<-c(5,3,3,3,2) 7 > q2<-c(4,5,5,3,2) 8 > q3<-c(5,2,5,4,1) 9 > q4<-c(5,5,5,NA,2) 10 > q5<-c(5,5,2,NA,1) 11 > leadership<-data.frame(manager,date,country,gender,age, 12 + q1,q2,q3,q4,q5,stringsAsFactors = FALSE) 13 > leadership 14 manager date country gender age q1 q2 q3 q4 q5 15 1 1 10/24/08 us m 32 5 4 5 5 5 16 2 2 10/28/08 us f 45 3 5 2 5 5 17 3 3 10/1/08 uk f 25 3 5 5 5 2 18 4 4 10/12/08 uk m 39 3 3 4 NA NA 19 5 5 5/1/09 uk f 99 2 2 1 2 1
?二 變量的創建、重編碼與重命名
變量的創建
假設有一個數據框mydata,其中有兩變量x1和x2,現想創建一個新變量sumx存儲這兩變量的和,并創建一個新變量meanx存儲這兩變量的均值,若使用下面代碼中的1與2會出錯,原因是R不知道x1和x2是來自數據框data,而應用代碼3和4
1 >sum<-x1+x2 2 >meanx<-(x1+x2)/2
3 > meanx<-(mydata$x1+mydata$x2) #這樣得到的是獨立的變量 4 >meanx<-(mydata$x1+mydata$x2)/2
?
創建新變量代碼4-2
方法一:
1 > mydata<-data.frame(x1<-c(2,2,6,4), 2 + x2<-c(3,4,2,8)) 3 > sumx<-mydata$x1+mydata$x2 4 > meanx<-(mydata$x1+mydata$x2)/2 5 > sumx 6 [1] 5 6 8 12 7 > meanx 8 [1] 2.5 3.0 4.0 6.0 方法二:
1 > attach(mydata) 2 > mydata$sumx<-x1+x2 3 > mydata$meanx<-(x1+x2)/2 4 > mydata$sumx 5 [1] 5 6 8 12 6 > mydata$meanx 7 [1] 2.5 3.0 4.0 6.0
方法三
1 >mydata<-transform(mydata, 2 sumx<-x1+x2, 3 meanx<-(x1+x2)/2)
變量重編碼
邏輯運算
小于(<) ? ? 小于或等于(<=) ? ?大于(>) ? ? ? ? 大于或等于(>=) ? ? ?嚴格等于(==)
不等于(!=) ?非x ?(!x)? ? ? ? ? ? x或y(x|y) ? ? ?x和y(x&y) ? ? ? ? ? ? 測試x是否為TRUE(isTRUE(x))
語句variable[condition] <- expression將僅在condition的值為TRUE時執行賦值1 > leadership$agecat[leadership$age<55]<-"Young" 2 > leadership$age[leadership$age=="99"] <- NA 3 > leadership$agecat[leadership$age>75]<-"Elder" 4 > leadership$agecat[leadership$age>=55 & 5 + leadership$age<=75]<-"Middle Aged" 6 > leadership$agecat[leadership$age<55]<-"Young" 7 > leadership 8 manager date country gender age q1 q2 q3 q4 q5 agecat 9 1 1 10/24/08 us m 32 5 4 5 5 5 Young 10 2 2 10/28/08 us f 45 3 5 2 5 5 Young 11 3 3 10/1/08 uk f 25 3 5 5 5 2 Young 12 4 4 10/12/08 uk m 39 3 3 4 NA NA Young 13 5 5 5/1/09 uk f NA 2 2 1 2 1 <NA>
或 1 > leadership<-within(leadership,{ 2 + agecat<-NA # 每句后面不能有逗號 3 + agecat[age>75] <-"Elder" 4 + agecat[age>=55 & age <=75]<-"Middle Aged" 5 + agecat[age<55] <-"Young"}) 6 > leadership 7 manager date country gender age q1 q2 q3 q4 q5 agecat 8 1 1 10/24/08 us m 32 5 4 5 5 5 Young 9 2 2 10/28/08 us f 45 3 5 2 5 5 Young 10 3 3 10/1/08 uk f 25 3 5 5 5 2 Young 11 4 4 10/12/08 uk m 39 3 3 4 NA NA Young 12 5 5 5/1/09 uk f 99 2 2 1 2 1 Elder
?函數within和函數with類似,不同的是它允許你修改數據框
?變量重命名
方法一:fix(leadership)
方法二:rename(dataframe,c(oldname=“newname”,oldname=“newname”,....)
方法三:names()
法一:1 > leaderhip 2 manager date country gender age q1 q2 q3 q4 q5 3 1 5 10/24/08 us m 32 5 4 5 5 5 4 2 4 10/28/08 us f 45 3 5 2 5 5 5 3 3 10/1/08 uk f 25 3 5 5 5 2 6 4 2 10/12/08 uk m 39 3 3 4 NA NA 7 5 1 5/1/09 uk f 99 2 2 1 2 1 8 > fix(leaderhip) # 注意括號是英文括號,不是中文括號 9 > leaderhip 10 managerID date country gender age q1 q2 q3 q4 q5 11 1 1 10/24/08 us m 32 5 4 5 5 5 12 2 2 10/28/08 us f 45 3 5 2 5 5 13 3 3 10/1/08 uk f 25 3 5 5 5 2 14 4 4 10/12/08 uk m 39 3 3 4 NA NA 15 5 5 5/1/09 uk f 99 2 2 1 2 1
法二:
1 > leaderhip<-rename(leaderhip, 2 + c(managerID="manager",date="testDate")) 3 > leaderhip 4 manager testDate country gender age q1 q2 q3 q4 q5 5 1 1 10/24/08 us m 32 5 4 5 5 5 6 2 2 10/28/08 us f 45 3 5 2 5 5 7 3 3 10/1/08 uk f 25 3 5 5 5 2 8 4 4 10/12/08 uk m 39 3 3 4 NA NA 9 5 5 5/1/09 uk f 99 2 2 1 2 1 法三:
1 > names(leaderhip) 2 [1] "manager" "testDate" "country" "gender" "age" "q1" 3 [7] "q2" "q3" "q4" "q5" 4 > names(leaderhip)[1]<-"managerID" 5 > leaderhip 6 managerID testDate country gender age q1 q2 q3 q4 q5 7 1 1 10/24/08 us m 32 5 4 5 5 5 8 2 2 10/28/08 us f 45 3 5 2 5 5 9 3 3 10/1/08 uk f 25 3 5 5 5 2 10 4 4 10/12/08 uk m 39 3 3 4 NA NA 11 5 5 5/1/09 uk f 99 2 2 1 2 1
三 日期值與缺失值
日期值
日期通常以字符串的形式輸入到R中,然后轉化為數值形式存儲的日期變量,函數as.Date()用于執行這種轉化,其語法為as.Date(x, "input_format"),其中x是字符型數據,input_format則是讀入日期的適當格式。
%d?數字表示的日期(0~31)?例如01~31
%a?縮寫的星期名?例如Mon
%A?非縮寫的星期名?例如Monday
%m?月份(00~12)?例如00~12
%b?縮寫的月份?例如Jan
%B?非縮寫的月份?例如January
%y?兩位數的年份?例如07
%Y?四位數的年份??例如2007
默認的日期格式為yyyy-mm-dd,語句為:
1 >mydates<-as.Date(c("2015-09-24","2015-09-25")) 2 >mydates 3 [1] "2015-09-24" "2015-09-25?
格式轉化1 >strDates<-c("24/09/2015","25/09/2015") 2 >dates<-as.Date(strDates,"%d/%m/%Y")# 注意 輸入的日期轉化為對應的日期,其次這里的Y是大寫的,
如果這里y小寫的話,會出現輸出結果時間不對。
注意要加斜杠 3 >dates 4 [1] "2015-09-24" "2015-09-25"
?
例子:1 >leadership 2 > manager date country gender age q1 q2 q3 q4 q5 3 1 10/24/08 us m 32 5 4 5 5 5 4 2 10/28/08 us f 45 3 5 2 5 5 5 3 10/1/08 uk f 25 3 5 5 5 2 6 4 10/12/08 uk m 39 3 3 4 NA NA 7 5 5/1/09 uk f 99 2 2 1 2 1 8 >leadership$date 9 [1] "10/24/08" "10/28/08" "10/1/08" "10/12/08" "5/1/09" 10 >myformat<-"%m/%d/%y" 11 >leadership$date<-as.Date(leadership$date,myformat)# 為什么這個格式不用加斜杠也行,而上面那個要加 斜杠 12 >leadership 13 manager date country gender age q1 q2 q3 q4 q5 14 1 2008-10-24 us m 32 5 4 5 5 5 15 2 2008-10-28 us f 45 3 5 2 5 5 16 3 2008-10-01 uk f 25 3 5 5 5 2 17 4 2008-10-12 uk m 39 3 3 4 NA NA 18 5 2009-05-01 uk f 99 2 2 1 2 1
?
當前日期Sys.Date()--返回今天的日期
date()--返回當前日期和時間
1 >Sys.Date() 2 [1] "2015-09-23" 3 >date() # 他人:這種方法返回的是字符串類型 4 [1] "Wed Sep 23 22:55:26 2015" 5 >today<-Sys.Date() 6 >format(today,format="%B %d %Y") # 格式化當前日期 7 [1] "九月 24 2015" 8 >format(today,format="%A") 9 [1] "星期四"
?
兩日期相減1 >startdate<-as.Date("2014-09-24") 2 >enddate<-as.Date("2015-09-24") 3 >days<-enddate-startdate 4 >days 5 Time difference of 365 days
?
用difftime()來計算時間間隔,并以星期(weeks),天(days),時(hours),分(minutes),秒(seconds)來表示。1 > today<-Sys.Date() 2 > wujiadong<-as.Date("1991-10-07") 3 > difftime(today,wujiadong,units = "weeks") 4 Time difference of 1250.429 weeks
此外:利用函數 strDates<-character(date) 可已經兩日期變量轉成成字符型變量.
? ? ? ?help(as.Date) and help(strftime)查看與日期和時間相關的函數
? ? ? ?相關包:lubridate?
缺失值
1 識別缺失值is.na()1 > y<-c(1,2,3,NA) 2 > is.na(y) 3 [1] FALSE FALSE FALSE TRUE 代碼4-3
1 > is.na(leaderhip[,6:10]) 2 q1 q2 q3 q4 q5 3 1 FALSE FALSE FALSE FALSE FALSE 4 2 FALSE FALSE FALSE FALSE FALSE 5 3 FALSE FALSE FALSE FALSE FALSE 6 4 FALSE FALSE FALSE TRUE TRUE 7 5 FALSE FALSE FALSE FALSE FALSE 2 重編碼某些值為缺失值
1 > leaderhip$age[leaderhip$age==99]<-NA 2 > leaderhip$age 3 [1] 32 45 25 39 NA 3 在分析中去除缺失值
1 > x<-c(1,2,NA,3) 2 > y<-x[1]+x[2]+x[3]+x[4] 3 > sumx<-y 4 > sumx 5 [1] NA#因有缺失值 6 > x<-c(1,2,NA,3) 7 > y<-sum(x,na.rm=TRUE)#去除x中的缺失值 # na.rm()刪除缺失值 8 > y 9 [1] 6 1 > leaderhip 2 managerID testDate country gender age q1 q2 q3 q4 q5 3 1 1 10/24/08 us m 32 5 4 5 5 5 4 2 2 10/28/08 us f 45 3 5 2 5 5 5 3 3 10/1/08 uk f 25 3 5 5 5 2 6 4 4 10/12/08 uk m 39 3 3 4 NA NA 7 5 5 5/1/09 uk f NA 2 2 1 2 1 8 > newdata<-na.omit(leaderhip) # na.omit()刪除帶有缺失值的行 9 > newdata 10 managerID testDate country gender age q1 q2 q3 q4 q5 11 1 1 10/24/08 us m 32 5 4 5 5 5 12 2 2 10/28/08 us f 45 3 5 2 5 5 13 3 3 10/1/08 uk f 25 3 5 5 5 2
?四 數據類型與類型轉換
ls.numerica() --as.numerica()
is.character()--as.character()
is.vector()--as.vector()
is.matrix()--as.matrix()
is.data.frame()--as.data.frame()
is.factor()--as.factor()
is.logical()--as.logical()
is.datatype()--返回結果是TRUE或FALSE
1 > a<-c(1,2,3) 2 > a 3 [1] 1 2 3 4 > is.numeric(a) 5 [1] TRUE 6 > is.vector(a) 7 [1] TRUE 8 > a<-as.character(a) 9 > a 10 [1] "1" "2" "3" 11 > is.numeric(a) 12 [1] FALSE 13 > is.vector(a) 14 [1] TRUE 15 > is.character(a) 16 [1] TRUE五 數據集的排序、合并與取子集
數據集的排序
1 > newdata<-leadership[order(leadership$age),] 2 > newdata 3 manager date country gender age q1 q2 q3 q4 q5 4 3 3 2008-10-01 uk f 25 3 5 5 5 2 5 1 1 2008-10-24 us m 32 5 4 5 5 5 6 4 4 2008-10-12 uk m 39 3 3 4 NA NA 7 2 2 2008-10-28 us f 45 3 5 2 5 5 8 5 5 2009-05-01 uk f 99 2 2 1 2 1 9 attach(leadership) 10 > newdata<-leadership[order(gender,age),] 11 > newdata 12 manager date country gender age q1 q2 q3 q4 q5 13 3 3 2008-10-01 uk f 25 3 5 5 5 2 14 2 2 2008-10-28 us f 45 3 5 2 5 5 15 5 5 2009-05-01 uk f 99 2 2 1 2 1 16 1 1 2008-10-24 us m 32 5 4 5 5 5 17 4 4 2008-10-12 uk m 39 3 3 4 NA NA 18 > newdata<-leadership[order(gender,-age),] 19 > newdata 20 manager date country gender age q1 q2 q3 q4 q5 21 5 5 2009-05-01 uk f 99 2 2 1 2 1 22 2 2 2008-10-28 us f 45 3 5 2 5 5 23 3 3 2008-10-01 uk f 25 3 5 5 5 2 24 4 4 2008-10-12 uk m 39 3 3 4 NA NA 25 1 1 2008-10-24 us m 32 5 4 5 5 5數據集的合并(向數據框中添加列(變量)和行(觀測))
? ? ? 添加列
要橫向合并兩個數據框(數據集),請使用merge()函數。在多數情況下,兩個數據框是通過一個或多個共有變量進行聯結的(即一種內聯結,inner join),例如:
total<-merge(dataframeA,dataframeB,by="ID")?# 按照ID進行了合并
?or
total<-merge(dataframeA,dataframeB,by=c("ID","Country"))?# 按照ID和Country進行了合并
or
total<-cbind(A,B)?# ?直接橫向合并兩個矩陣或數據框,并且不需要指定一個公共索引
? ? ? ? ? ? ? ? ? ? ? ? ? ? # ??每個對象必須擁有相同的行數,且要有相同順序排序。
? ? ? ?添加行
rbind()--縱向合并兩個數據框
total<-rbind(dataframeA,dataframeB)?#?兩個數據框必須擁有相同的變量,不過它們的順序不必一定相同。若dataframeA中有dataframeB中沒有的變量,則做一下處理:
? 刪除dataframeA中的多余變量;
? 在dataframeB中創建追加的變量并將其值設為NA(缺失)
?
數據集取子集
選入變量1 >newdata<-leadership[,c(6:10)] 2 > newdata 3 q1 q2 q3 q4 q5 4 1 5 4 5 5 5 5 2 3 5 2 5 5 6 3 3 5 5 5 2 7 4 3 3 4 NA NA 8 5 2 2 1 2 1
?
剔除變量方法一:
1 > myvars<-names(leadership)%in%c("q3","q4") 解釋:(1) names(leadership)生成了一個包含所有變量名的字符型向量 2 > newdata<-leadership[!myvars] (2) names(leadership) %in% c("q3", "q4")返回了一個邏輯型向量,names(leadership) 3 > newdata 中每個 匹配q3或q4的元素的值為TRUE,反之為FALSE 4 manager date country gender age q1 q2 q5 (3) 運算符非(!)將邏輯值反轉 5 1 1 2008-10-24 us m 32 5 4 5 (4) leadership[c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, 6 2 2 2008-10-28 us f 45 3 5 5 TRUE)]選擇了邏輯值為TRUE的列,于是q3和q4被剔除了 7 3 3 2008-10-01 uk f 25 3 5 2 8 4 4 2008-10-12 uk m 39 3 3 NA 9 5 5 2009-05-01 uk f 99 2 2 1 方法二:
1 >newdata<-leadership[c(-8,-9)] 2 > newdata 3 manager date country gender age q1 q2 q5 4 1 1 2008-10-24 us m 32 5 4 5 5 2 2 2008-10-28 us f 45 3 5 5 6 3 3 2008-10-01 uk f 25 3 5 2 7 4 4 2008-10-12 uk m 39 3 3 NA 8 5 5 2009-05-01 uk f 99 2 2 1 方法三:
1 leadership$q3<-leadership$q4<-NULL 2 > leadership 3 manager date country gender age q1 q2 q5 4 1 1 2008-10-24 us m 32 5 4 5 5 2 2 2008-10-28 us f 45 3 5 5 6 3 3 2008-10-01 uk f 25 3 5 2 7 4 4 2008-10-12 uk m 39 3 3 NA 8 5 5 2009-05-01 uk f 99 2 2 1
?
subset()函數1 > newdata<-subset(leadership,age>=35|age<24, 2 + select = c(q1,q2,q3,q4)) 3 > newdata 4 q1 q2 q3 q4 5 2 3 5 2 5 6 4 3 3 4 NA 7 5 2 2 1 2 1 > newdata<-subset(leadership,gender=="m" & age>25, 2 + select = gender:q4) 3 > newdata 4 gender age q1 q2 q3 q4 5 1 m 32 5 4 5 5 6 4 m 39 3 3 4 NA
?
隨機抽樣1 > mysample<-leadership[sample(1:nrow(leadership),3, 2 + replace=FALSE),] 3 > mysample 4 manager date country gender age q1 q2 q3 q4 q5 5 4 4 10/12/08 uk m 39 3 3 4 NA NA 6 5 5 5/1/09 uk f 99 2 2 1 2 1 7 2 2 10/28/08 us f 45 3 5 2 5 5
?
使用sql語句操作數據框
?
轉載于:https://www.cnblogs.com/wujiadong2014/p/4838661.html
總結
以上是生活随笔為你收集整理的R语言学习笔记(4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Maven的SSH框架搭建
- 下一篇: Nodejs从小工到专家系列(一)