數據集
2.1數據集概念
概念:通常是由數據構成的矩形數據
不同行業對數據集的行和列叫法不同
| 行業人 | 行 | 列 |
| 統計學家 | 觀測(observation) | 變量(variable) |
| 數據庫分析師 | 記錄(record) | 字段(field) |
| 數據挖掘和機器學習研究中 | 示例(example) | 屬性(attribute) |
可處理的數據類型(模式):數值型、字符型、邏輯型、復數型、原生型(字節)
存儲數據的結構:標量、向量、數據、數據框和列表
實例的標識符:rownames(行名);實例的類別型:因子(factors)
2.2數據結構
這節講了幾個數據結構,向量、矩陣、數組、數據框,前三種分別是一維、二維、大於二維的,它們共同點是一個數據結構中,僅能用一種數據的模式,而數據框則可以多種模式。
一些定義
對象:可復制給變量的任何事物,包括常量、數據結構、函數、圖形
模式:描述對象如何存儲和某各類
數據框:存儲數據的一種結構(列表示變量,行表示觀測),一個數據框可存儲不同類型的變量(如數值型、字符型)
2.2.1 向量(一維數據,數值型、字符型、邏輯型)
a<- c(1,2,3) #數值型
b<-c("one","two","three")#字符型
c<-c(TRUE,TURE,FALSE) #邏輯型
注意:1.字符型的向量,元素要加“ ”或者' ',數值型和邏輯型不需要。
2.同一向量,只能用一種模式的數據;
3.標量是只含一個元素的向量
#標量是 只含一個元素的向量 f<- 1 g<-"US" h<-TRUE
方括號的作用:元素的位置數值,具體如何訪問向量中的元素,看下面代碼
> a<-c("k","j","h","a","c","m") #生成一個向量
> a[3] #向量a的第三個元素
[1] "h"
> a[c(1,3,5)] #向量a的第1個、第3個、第5個元素
[1] "k" "h" "c"
> a[2:6] #生成一個數值序列,向量a的從第2個到第6個的元素。等價於a(
[1] "j" "h" "a" "c" "m"
#兩種方式生成的向量a一樣
> a<-c(2:6)
> a
[1] 2 3 4 5 6
> a<-c(2,3,4,5,6)
> a
[1] 2 3 4 5 6
2.2.2 矩陣(二維數值,字符型、數值型、邏輯型)
注意:矩陣中僅能包含一種數據類型
函數matrix()
作用:創建矩陣
格式:myymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns, byrow=logical_value, dimnames=list(char_vector_rownames, char_vector_colnames))
其中,vector--矩陣的元素;nrow、ncol--分別制定行和列的維數;dimnames--可選的、以字符型向量表示的行名和列名;byrow--矩陣行行填充(byrow = TRUE)或者按列填充(byrow =FALSE),默認是按列。
matrix用法實例
eg1. 創建一個元素為1到20,大小5*4的矩陣,默認按列排列。
> y<-matrix(1:20,nrow=5,ncol=4)
> y
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
eg2.
> cells <- c(1,26,24,68)
> rnames<-c("R1","R2")
> cnames<-c("C1","C2")
#按列排列(也是默認方式)
> mymatrix<-matrix(cells,nrow=2,ncol=2,byrow=FALSE,dimnames=list(rnames,cnames))
> mymatrix
C1 C2
R1 1 24
R2 26 68
#按行排列
> mymatrix<-matrix(cells,nrow=2,ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
> mymatrix
C1 C2
R1 1 26
R2 24 68
選擇矩陣中的元素:
X[i,]:矩陣中的第i行; X[,j]:矩陣中的第j列; X[i,j]:第i行即j列元素
選擇多行或多列,下標i和j可為數值型向量
例子:
> x<-matrix(1:10,nrow=2)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> x[2,]
[1] 2 4 6 8 10
> x[,2]
[1] 3 4
> x[1,4] #第1行的第4各個元素
[1] 7
> x[1,c(4,5)] #第1行的,第4個元素和第5個元素
[1] 7 9
2.2.3 數組(維度可以大於2)
注意:數組中的數據只能擁有一種模式
創建方式:array( )
myaaray <- array(vector, dimensions, dimnames)
其中,vector -- 數組的中數據;dimensions -- 數值型向量,給出各維度的最大值;dimnames -- 可選的、各維度名稱標簽的列表.
eg.創建三維(2*3*4)數值型數組
> dim1<-c("A1","A2")
> dim2<-c("B1","B2")
> dim2<-c("B1","B2","B3")
> dim3<-c("C1","C2","C3","C4")
> z<-array(1:24,c(2,3,4),list(dim1,dim2,dim3))
> z
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
> z<-array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3))
> z
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
選取元素的方式與居住類似,例如:z[1,2,3]為15.
2.2.4 數據框(可包含不同模式(數值型、字符型等)的數據)
注意:可將多種模式的數據放入一個矩陣,但每列的數據模式必須唯一,不同列模式可以不同
創建函數 data.frame( )
mydata <- data.frame(col1, col2, col3)
其中,列向量col1,col2,col3可為任何類型(如字符型、數值型或邏輯型)
> patientID<-c(1,2,3,4)
> age<-c(25,34,28,52)
> diabetes<-c("Type1","Type2","Type1","Type2")
> status<-c("Poor","Improved","Excellent","Poor")
> patientdata<-data.frame(patientID,age,diabetes,status)
> patientdata
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type2 Poor
選取數據框中的元素:1.用下標記號。2.直接指定列明。3.$:選取給定數據框的某個特定變量
> patientdata[1:2]
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
> patientdata[c(1:3)]
patientID age diabetes
1 1 25 Type1
2 2 34 Type2
3 3 28 Type1
4 4 52 Type2
> patientdata[c("diabetes","status")]
diabetes status
1 Type1 Poor
2 Type2 Improved
3 Type1 Excellent
4 Type2 Poor
> patientdata$age
[1] 25 34 28 52
用$生成diabetes和status的列聯表
Excellent Improved Poor Type1 1 0 1 Type2 0 1 1
比數據框$變量名調用變量更簡單的方法是用attach()和detach(),和with
1.attach( )、detach()和with()
attach()可將數據框添加到R的搜索路徑,有了它,調用數據框里的變量時,就不需要再告訴R現在調用的變量在什么數據框了。
detach()是將數據框從搜索路徑中移除。
attach()和detach()像是一對兄弟,但事實上,detach不對數據本身作用,可以省略。
summary(mtcars$disp) plot(mtcars$mpg,mtcars$disp) plot(mtcars$mpg,mtcars$wt)
等價於
attach(mtcars) summary(mpg) plot(mpg,disp) plot(mpg,wt) detach(mtcars)
局限:當名稱相同的對象不止一個,用attach()就會出問題。原始對象將取得優先權,后來的對象將被屏蔽(masked)。
with()如何得到與上面代碼一樣的結果呢,看如下代碼
with(mtcars,{
print(summary(mpg))
plot(mpg,disp)
plot(mpg,wt)})
with(mtcars,{print(summary(mpg))
plot(mpg,disp)
plot(mpg,wt)})
注意花括號里要沒有逗號,要換行隔開,我自己運行,沒換行不能實現。花括號的語句都是針對數據框mtcars,如果花括號里只有一條語句,花括號可以省略
局限:賦值僅在此函數的括號內剩下。
改進:用特殊復制符<<-代替<-,則可將對象保存到with外的全局環境中。
> with(mtcars,{nokeepstates<-summary(mpg)
+ keepstates<<-summary(mpg)})
> nookeepstates
Error: object 'nookeepstates' not found
> keepstates
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.43 19.20 20.09 22.80 33.90
結果不言而喻,因為keepstates保存到with()之外的全局環境中,而nookeepstates沒有,所以當離開了with(),只有keepstates存在。
2.實力標識符
通過row.names=某個變量指定實例標識符,我的理解,是我們在學校的學號,工作中的工號那樣的作用
patientdata<-data.frame(patientID,age,diabetes,status,row.names=patientID)將patientID指定為R中標記各類打印輸出和圖形中實例名稱所用變量(這是書本的原話),我的理解是patientID是數據框中唯一可以標識身份的變量。每個實例或者說是觀測來說是獨一無二的。
2.2.5 因子(決定數據的分析方式和視覺呈現方式)
| 變量 | ||
| 名義型變量 | 沒順序的類別變量 | 因子 |
| 有序型變量 | 有順序關系,沒數量關系 | 因子 |
| 連續型變量 | 同時有順序和變量 | ---- |
函數:factor()
作用:以整數向量形式存儲類別值,從1開始,將一個由字符串(原始值)組成的內部向量映射到這些整數上。
將原始值轉化成數值型變量
- 名義型變量--->以整數向量形式存儲
disabetes <- c("Type1", "Type2" ,"Typye1", "Type1")
> diabetes<-factor(diabetes) #將向量diabetes存儲為(1,2,1,1) > diabetes #關聯關系為1=Type1,2=Type2 (賦值根據字母順序定) [1] Type1 Type2 Type1 Type2 Levels: Type1 Type2 > str(diabetes) Factor w/ 2 levels "Type1","Type2": 1 2 1 2注意:針對diabetes的任何分析都將作為名義型向量對的,並自動選擇適合這一測量尺度的統計方法。
- 有序型變量---->以整數向量形式存儲(在factor()函數中葯加入參數ordered=TRUE)
> status<-c("Poor","Improved","Excellent","Poor") > status [1] "Poor" "Improved" "Excellent" "Poor" > status<-factor(status,ordered=TRUE,levels = c("Poor","Improved","Excellent")) #因子的水平默認依據字母順序而定,levels覆蓋默認排序 > str(status) Ord.factor w/ 3 levels "Poor"<"Improved"<..: 1 2 3 1注意:針對此變量進行的任何分析都會作為有序型變量對待,並自動選擇合適的統計方法
- 數值型變量(需要用到參數levels和labels)
假設男性編碼成1,女性編碼成2
> sex<-c(1,1,2) > sex<-factor(sex,levels = c(1,2),labels = c("Male","Female")) > str(sex) Factor w/ 2 levels "Male","Female": 1 1 2注意:標簽的順序labels = c( "Male", "Female")和水平一致levels = c( 1, 2 )
標簽"Male"和"Female"將代替1和2在結果種輸出,而不是1或者2的性別變量將被當作缺失值。> sex<-c(1,2,3) > sex<-factor(sex,levels = c(1,2),labels = c("Male","Female")) > str(sex) Factor w/ 2 levels "Male","Female": 1 2 NA
下面看普通因子和有序因子如何影響數據分析
#以向量形式輸入
patientID <- c(1, 2, 3, 4) age <- c(25, 34, 28, 52) diabetes <- c("Type1", "Type2", "Type1", "Type1") status <- c("Poor", "Improved", "Excellent", "Poor") #將diabetes指定為普通因子
diabetes <- factor(diabetes)
#將status指定為有序型因子 status <- factor(status, order=TRUE)
#將數據合並為數據框 patientdata <- data.frame(patientID, age, diabetes, status)
#str(object)顯示對象的結果,提供R中某個對象(此例為數據框)的信息 str(patientdata)
$summary() 區別對待各個變量,顯示對象的統計概要 summary(patientdata)
運行后
> str(patientdata) 'data.frame': 4 obs. of 4 variables: $ patientID: num 1 2 3 4 $ age : num 25 34 28 52 $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 2 $ status : Factor w/ 3 levels "Excellent","Improved",..: 3 2 1 3 > summary(patientdata) patientID age diabetes status Min. :1.00 Min. :25.00 Type1:2 Excellent:1 1st Qu.:1.75 1st Qu.:27.25 Type2:2 Improved :1 Median :2.50 Median :31.00 Poor :2 Mean :2.50 Mean :34.75 3rd Qu.:3.25 3rd Qu.:38.50 Max. :4.00 Max. :52.00
運行str()后,清楚地顯示diabetes是一個因子,status是有序型因子以及數據框在內部如何編碼
運行summary()后,各個變量區別被對待,顯示連續型變量age的最小值、最大值、均值、四分位數。而diabetes和status(各水平)這兩個因子則顯示頻數值。
2.2.6 列表
定義:對象(或成分)的有集合。允許整合若干(可能無關)對象到單個對象名下。
因此,某個對象可能是若干向量、矩陣、數據框甚至其他列表的組合。
創建列表的函數: list()
mylist <- list( object1, object2,...)
列表中的對象命名: mylist<- list(name1 = object1,name2 = object2)
g<-"My First List" #字符串
h<-c(25,26,18,39)#數值型向量
j<-matrix(1:10,nrow=5)#5*2的矩陣
k<-c("one","two","three")#字符型向量
mylist<-list(title=g,h,j,k) #創建列表,其中,第一個對象命名為title
> mylist
$title
[1] "My First List"
[[2]]
[1] 25 26 18 39
[[3]]
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
[[4]]
[1] "one" "two" "three"
訪問列表中的元素 1.可通過雙括號致命帶包某個成分的數字。2.通過名稱
> mylist[[1]] [1] "My First List" > mylist[["title"]] [1] "My First List" > mylist$title #要命名了才可以 [1] "My First List"
以上是基本的各種數據結構。
2.3 數據的輸入
2.3.1 使用鍵盤輸入數據
函數:edit()調用允許手動輸入數據的文本編輯器
步驟:創建空數據框,其中變量名和變量的模式與最終的數據集要一致-->對這個數據對象調用文本編輯器-->鍵入數據-->保存
例子:創建一個名為mydata的數據框,含三個變量:age(數值型),gender(字符型),weight(數值型)-->調用文本編輯器edit()-->鍵入數據-->保存結果
mydata<- data.frame(age = numeric(0),gender = character(0),weight=numeric(0)) mydata<-edit(mydata)

說明:age=numeric(0)創建指定模式但不含實際數據的變量。編輯結果需要賦值回對象本身,因為edit()實際上是對對象的副本操作,不賦值到一個目標,你的所有修改將全部丟失。
關閉編輯器后,結果會保存到之前賦值的對象中,本例為mydata。fix(mydata)與edit(mydata)
直接在程序中嵌入數據集
mydatatxt <- " age gender weight 25 m 166 30 f 115 18 f 120 " mydata <- read.table(header=TRUE, text=mydatatxt)
說明:一個字符型變量被穿鑒於存儲原始數據,然后read.table()處理字符串並返回數據框、
2.2.3 從帶分隔符的文本文件導入數據
mydataframe<-read.table(file,options)
file--帶分隔符的ASCII文本文件
options--控制如何處理數據的選項。
2.2.4 導入excel數據
read.xlsx(file,n)
file--Excel工作簿所在路徑
n--導入的工作表序號
其它的方式等遇到再看。
