第2章 創建數據集
2.1 數據集的概念
R可以處理的數據類型(模式)包括數值型、字符型、邏輯型( TRUE/FALSE)、複數型(虛數)和原生型(字節)。
2.2 數據結構
- 對象(object)是指可以賦值給變量的任何事物,包括常量、數據結構、函數,甚至圖形。對象都擁有某種模式,描述了此對象是如何存儲的,以及某個類,像print這樣的泛型函數表明如何處理此對象。
- 數據框(data frame)是R中用於存儲數據的一種結構:列表示變量,行表示觀測。在同一個數據框中可以存儲不同類型(如數值型、字符型)的變量。數據框將是你用來存儲數據集的主要數據結構。
- 因子(factor)是名義型變量或有序型變量。它們在R中被特殊地存儲和處理。
2.2.1 向量
- 向量是用於存儲數值型、字符型或邏輯型數據的一維數組。
- 執行組合功能的函數c()可用來創建向量。
a <- c(1, 2, 5, 3, 6, -2, 4)
b <- c("one", "two", "three")
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)
#標量是隻含一個元素的向量
f <- 3
g <- "US"
h <- TRUE
#同一向量中無法混雜不同模式的數據
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),默認情況下按列填充。
我們可以使用下標和方括號來選擇矩陣中的行、列或元素。 X[i,]指矩陣 X中的第i行,X[,j]指第j列,X[i, j]指第i行第j個元素。選擇多行或多列時,下標 i和j可爲數值型向量
2.2.3 數組
數組(array)與矩陣類似,但是維度可以大於2。
數組可通過array函數創建
myarray <- array(vector, dimensions, dimnames)
#其中vector包含了數組中的數據, dimensions是一個數值型向量,給出了各個維度下標的最大值,而dimnames是可選的、各維度名稱標籤的列表。
2.2.4 數據框
- 由於不同的列可以包含不同模式(數值型、字符型等)的數據,數據框的概念較矩陣來說更爲一般。
- data.frame()
mydata <- data.frame(col1, col2, col3,...)
#其中的列向量 col1、col2、col3等可爲任何類型(如字符型、數值型或邏輯型)。每一列的名稱可由函數names指定。
選取數據框中元素的方式有若干種。你可以使用前述(如矩陣中的)下標記號,亦可直接指定列名。
> patientdata[1:2]
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
> patientdata[c("diabetes", "status")]
diabetes status
1 Type1 Poor
2 Type2 Improved
3 Type1 Excellent
4 Type1 Poor
> patientdata$age
[1] 25 34 28 52
(1) attach()、detach()
attach(mtcars)
summary(mpg)
plot(mpg, disp) plot(mpg, wt)
detach(mtcars)
#函數attach()可將數據框添加到R的搜索路徑中。
#函數detach()將數據框從搜索路徑中移除。
#detach()並不會對數據框本身做任何處理。
當名稱相同的對象不止一個時,這種方法的侷限性就很明顯了。
> mpg <- c(25, 36, 47)
> attach(mtcars)
The following object(s) are masked _by_'.GlobalEnv':
mpg
> plot(mpg, wt)
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' and 'y' lengths differ
> mpg [1] 25 36 47
#這裏,在數據框mtcars被綁定(attach)之前,你們的環境中已經有了一個名爲mpg的對象。在這種情況下,原始對象將取得優先權,這與你們想要的結果有所出入。由於mpg中有3個元素而disp中有32個元素,故plot語句出錯。
(2) with()
with(mtcars, {
print(summary(mpg))
plot(mpg, disp)
plot(mpg, wt)
})
#在這種情況下,花括號 {}之間的語句都針對數據框 mtcars執行,這樣就無需擔心名稱衝突了。如果僅有一條語句(例如summary(mpg)),那麼花括號 {}可以省略。
函數with()的侷限性在於,賦值僅在此函數的括號內生效。如果你需要創建在 with()結構以外存在的對象,使用特殊賦值符(<<-)替代標準賦值符(<-)即可,它可將對象保存到 with()之外的全局環境中。
(3) 實例標識符
在病例數據中,病人編號(patientID)用於區分數據集中不同的個體。在R中,實例標識符(case identifier)可通過數據框操作函數中的rowname選項指定。
patientdata <- data.frame(patientID, age, diabetes, status, row.names=patientID)
2.2.5 因子
- 變量可歸結爲名義型、有序型或連續型變量。名義型變量是沒有順序之分的類別
- 類別(名義型)變量和有序類別(有序型)變量在R中稱爲因子(factor)
- 函數factor()以一個整數向量的形式存儲類別值,整數的取值範圍是 [1…k](其中k是名義型變量中唯一值的個數),同時一個由字符串(原始值)組成的內部向量將映射到這些整數上。
- 要表示有序型變量,需要爲函數 factor()指定參數ordered=TRUE。
diabetes <- c("Type1", "Type2", "Type1", "Type1")
#語句diabetes <- factor(diabetes)將此向量存儲爲 (1, 2, 1, 1),並在內部將其關聯爲 1=Type1和2=Type2(具體賦值根據字母順序而定)。
status <- c("Poor", "Improved", "Excellent", "Poor")
status <- factor(status, ordered=TRUE)
#會將向量編碼爲 (3, 2, 1, 3),並在內部將這些值關聯爲 1=Excellent、2=Improved以及3=Poor。
#對於字符型向量,因子的水平默認依字母順序創建。通過指定levels選項來覆蓋默認排序。
status <- factor(status, order=TRUE, levels=c("Poor", "Improved", "Excellent"))
#數值型變量可以用 levels和labels參數來編碼成因子。如果男性被編碼成1,女性被編碼成2,則以下語句:
sex <- factor(sex, levels=c(1, 2), labels=c("Male", "Female"))
2.2.6 列表
列表就是一些對象(或成分, component)的有序集合。列表允許你整合若干(可能無關的)對象到單個對象名下。
某個列表中可能是若干向量、矩陣、數據框,甚至其他列表的組合。
mylist <- list(object1, object2, ...)
mylist <- list(name1=object1, name2=object2, ...)
#可以通過在雙重方括號中指明代表某個成分的數字或名稱來訪問列表中的元素。
2.3 數據的輸入
2.3.1 使用鍵盤輸入數據
R中的函數edit()會自動調用一個允許手動輸入數據的文本編輯器
(1) 創建一個空數據框(或矩陣),其中變量名和變量的模式需與理想中的最終數據集一致;
(2) 針對這個數據對象調用文本編輯器,輸入你的數據,並將結果保存回此數據對象中。
mydata <- data.frame(age=numeric(0), gender=character(0), weight=numeric(0))
mydata <- edit(mydata)
#類似於age=numeric(0)的賦值語句將創建一個指定模式但不含實際數據的變量。
#注意,編輯的結果需要賦值回對象本身。函數edit()事實上是在對象的一個副本上進行操作的。如果你不將其賦值到一個目標,你的所有修改將會全部丟失!
mydata <- edit(mydata)的一種簡捷的等價寫法是fix(mydata)
此外,你可以直接在你的程序中嵌入數據集
> mydatatxt<-"
+ age gender weight
+ 25 m 166
+ 30 f 115
+ 18 f 120"
> mydata <- read.table(header=TRUE, text=mydatatxt)
> mydata
age gender weight
1 25 m 166
2 30 f 115
3 18 f 120
#在Rstudio中似乎不行,在R中可行