【R語言基礎】05 數據整合Ⅰ
一、數據框創建新變數
假設有MyData數據框,其中變數為x1,x2. 現創建名為sumx和meanx的新變數,分別存儲變數x1與x2的加和與均值。
#方法1
MyData$sumx <- MyData$x1 + MyData$x2MyData$meanx <- (MyData$x1 + MyData$x2)/2
#方法2
attach(MyData)MyData$sumx <- x1+x2MyData$meanx <- (x1+x2)/2detach(MyData)
#方法3(建議方法)
MyData <- transform(MyData, sumx = x1 + x2,meanx = (x1+x2)/2)
二、變數的重命名
1. 用互動式編輯器
若修改數據集x的變數名,鍵入函數fix(x),即可打開互動式編輯器界面。
score<-data.frame(student=c("A","B","C","D"),gender=c("M","M","F","F"),math=c(90,70,80,60),Eng=c(88,78,69,98),pl=c(66,59,NA,88))fix(score)score.list<-as.list(score) #將score轉化為列表fix(score.list)
(1)若數據集為矩陣或數據框
將打開「數據編輯器」,單擊要修改的變數名,在彈出的「變數編輯器」修改即可:
(2)若數據集為列表
將互動式編輯器為一個記事本,只需修改「.Names」之後對應的變數名即可:
2. 用函數rename()
reshape包中的函數rename(),用來修改數據框和列表的變數名,但不能修改矩陣的變數名,基本格式為:
rename(x, c(oldname="newname",...))
其中,oldname為原變數名,newname為新變數名。
library(reshape)rename(score,c(pl="chinese")) student gender math Eng chinese1 A M 90 88 662 B M 70 78 593 C F 80 69 NA4 D F 60 98 88rename(score.list,c(pl="chinese"))$student[1] A B C DLevels: A B C D $gender[1] M M F FLevels: F M $math[1] 90 70 80 60 $Eng[1] 88 78 69 98 $chinese[1] 66 59 NA 88
注意:原數據集中的變數名並未被修改。
3. 用函數names()
和rename()一樣可用來修改數據框和列表的變數名,不能修改矩陣的變數名;區別在於:names()會在原數據集中修改變數名。
其基本格式為: names(x)[i]<- "newname"
names(score)[5]="chinese"score student gender math Eng chinese1 A M 90 88 662 B M 70 78 593 C F 80 69 NA4 D F 60 98 88
4. 用函數colnames()和rownames()
用來修改矩陣的變數名(行名和列名),也能修改數據框的行名和列名。基本格式為:
rownames(x)[i]<- "newname"
colnames(score)[5]="Chinese"score student gender math Eng Chinese1 A M 90 88 662 B M 70 78 593 C F 80 69 NA4 D F 60 98 88rownames(score)=letters[1:4]score student gender math Eng Chinesea A M 90 88 66b B M 70 78 59c C F 80 69 NAd D F 60 98 88
三、變數的重新編碼
例如,數據集Leader中連續型變數age重新編碼為分類型變數rankAge (Young、Middle Aged、Elder)。
首先,必須把99歲的年齡值重新編碼為缺失值:
Leader$age[Leader$age == 99] <-NA
然後創建rankAge變數:
Leader$rankAge[Leader$age>75] <- "Elder"Leader$rankAge[Leader$age>=50 & Leader$age <=75] <- "Middle Aged"Leader$rankAge[Leader$age<50] <- "Young"
或者
Leader<-within(Leader, { rankAge<-NA rankAge[age>75] <- "Elder" rankAge[age>=50 & age<=75]<-"Middle Aged" rankAge[age<50] <- "Young"})
四、數據排序
1.函數sort(),基本格式:
sort(x,decreasing=FALSE,na.last= FALSE,...)
其中,
x為排序對象(數值型或字元型);
decreasing默認為FALSE即升序,TURE為降序;
na.last默認為FALSE(NA值將被刪除),若為TRUE,則將向量中的NA值放到序列末尾。
sort(score$math)[1] 60 70 80 90sort(score$math,decreasing = TRUE)[1] 90 80 70 60sort(score$Chinese,na.last = TRUE)[1] 59 66 88 NA
2.函數rank()
返回值是該向量中對應元素的秩(排名),基本格式為:
rank(x, na.last= FALSE,ties.method=...)
其中,ties.method指定對數據集中的重複數據的秩的處理方式:
「average」——取平均值秩(默認)
「first」——位於前面的數據的秩取小,依次遞增
「random」——隨機定義重複秩
「max」——取最大重複秩
「min」——取最小重複秩
x<-c(3,4,2,5,5,3,8,9)rank(x)[1] 2.5 4.0 1.0 5.5 5.5 2.5 7.0 8.0rank(x,ties.method = "first")[1] 2 4 1 5 6 3 7 8rank(x,ties.method = "random")[1] 3 4 1 6 5 2 7 8rank(x,ties.method = "max")[1] 3 4 1 6 6 3 7 8
3. 函數order()
對數據進行排序,返回值是對應「排名」的元素所在向量中的位置,即最小值、次小值、...、最大值所在的位置。基本格式為:
order(x,decreasing=FALSE,na.last= FALSE,...)
不同於前兩個函數,order()還可以對數據框進行排序:
data_frame[order(data_frame$v1,data_frame$v2, …),]
若v1值相同,則按v2升序排序;要將升序改為降序,在變數前添加負號,或用decreasing = TRUE即可。
order(score$math)[1] 4 2 3 1score[order(score$math),] student gender math Eng chinese4 D F 60 98 882 B M 70 78 593 C F 80 69 NA1 A M 90 88 66score[order(-score$math),] student gender math Eng chinese1 A M 90 88 663 C F 80 69 NA2 B M 70 78 594 D F 60 98 88
4. 函數rev()
求逆序,將序列進行反轉,即1,2,3變成3,2,1
注:數據框轉置(行列交換),使用t(data)即可。
主要參考文獻:
[1] Robert I. Kabacoff著,高濤,肖楠,陳鋼譯,R語言實戰. 人民郵電出版社.
[2] 李詩羽,張飛,王正林,數據分析:R語言實戰. 電子工業出版社.
推薦閱讀:
※R語言實戰(一)R語言介紹+(二)創建數據集
※R語言入門與實戰:大數據人才缺口巨大,現在學習還不晚
※決策樹之ID3和C4.5
※為什麼R語言是當今最值得學習的數據科學語言