1. 向量
向量(vector)是用於存儲數值型、字符型、邏輯型數據的一維數組。標量可以看作是 只含有一個元素的向量。
函數c( )可用來創建向量,例如:
x1 <- c(2, 4, 1, -2, 5)
x2 <- c("one", "two", "three")
x3 <- c(TRUE, FALSE, TRUE, FALSE)
這里 x1 是數值型向量,x2 是字符型向量,而 x3 是邏輯型向量。每一個向量中的數據類型必須一致。
如果想創建有規律的向量,R 提供了一些簡便的操作和函數,例如:
x4 <- 1:5 # 等價於x4 <- c(1, 2, 3, 4, 5)
x5 <- seq(from = 2, to = 10, by = 2) # 等價於x5 <- c(2, 4, 6, 8, 10)
x6 <- rep("a", times = 4) # 等價於x6 <- c("a", "a", "a", "a")
有時候我們只想使用向量中的某個部分,即選取向量的子集。
假設有一個從 3 到 100 的步長為 7 的整數向量,那么第5 個數的值是多少呢?
x <- seq(from = 3, to = 100, by = 7)
x
2. 因子
一般來說,變量有數值型、名義型和有序型之分。名義型變量是沒有順序關系的分類變量,例如人的性別、血型、民族等。而有序型變量是有層級和順序關系的分類變量,如患者的病情(較差、好轉、很好)。名義型變量和有序型變量在 R 中稱為因子(factor)。 因子在 R 中非常重要,它決定了數據的展示和分析方式。數據存儲時因子經常以整數向量形式存儲。
所以在進行數據分析之前,經常需要將它們用函數 factor( )
轉換為因子。例如:
sex <- c(1, 2, 1, 1, 2, 1, 2) sex.f <- factor(sex, levels = c(1, 2), labels = c("Male", "Female")) sex.f
上面的命令先定義了一個變量 sex 表示性別,假設其取值 1 表示男性,2 表示女性。接着用函數 factor( ) 將變量 sex 轉換成了因子並存為對象 sex.f,其中參數 levels 表示原變量的分類標簽值,參數 labels 表示因子取值的標簽。注意,這兩個參數在賦值時需要一一對應,R 會將它們相關聯。因子型變量與一般的字符型變量的區別就是它有一個水平(level)屬性。
因子的屬性可以使用函數 levels( )
查看:
levels(sex.f)
改變因子水平的排列順序 → 改變參考組
在統計模型中,對於因子型變量,R 會將其第一個水平當作參考組。很多時候我們需要改變因子水平的排列順序以改變參考組,這可以通過兩種方法實現。
第一種方法是在函數 factor( ) 中改變參數 levels 和 labels 的排列順序,例如:
sex.f1 <- factor(sex, levels = c(2, 1), labels = c("Female", "Male")) sex.f1
第二種方法是使用函數 relevel( )
:
sex.f1 <- relevel(sex.f, ref = "Female") sex.f1
有序因子:ordered = TRUE
要表示有序因子,需要在函數 factor ( ) 里指定參數ordered = TRUE。例如:
status <- c(1, 2, 2, 3, 1, 2, 2) status.f <- factor( status, levels = c(1, 2, 3), labels = c("Poor", "Improved", "Excellent"), ordered = TRUE ) status.f
7. 數據類型的轉換:is.、as.
在進行數據分析時,分析者需要對數據的類型熟稔於心,因為數據分析方法的選擇與數據的類型是有密切聯系的。R 提供了一系列用於判斷某個對象的數據類型的函數,還提供了將某種數據類型轉換為另一種數據類型的函數。這些函數都存在於基本包 base 里,下面列出了其中的一部分常用函數:
數據類型的判斷與轉換函數
判斷 | 轉換 |
---|---|
is.numeric( ) | as.numeric( ) |
is.character( ) | as.character( ) |
is.logical( ) | as.logical( ) |
is.factor( ) | as.factor( ) |
is.vector( ) | as.vector( ) |
is.matrix( ) | as.matrix( ) |
is.array( ) | as.array( ) |
is.data.frame( ) | as.data.frame( ) |
is.list( ) | as.list( ) |
is.table( ) | as.table( ) |
以 is.
開頭的函數的返回值為 TRUE 或 FALSE,而以 as.
開頭的函數將對象轉換為相應的類型。
8. 獲取其他格式的數據
8.1 txt 與csv 格式
如果數據來源是一個用 Windows 記事本或其他純文本編輯器所創建的 ASCII 格式文件,我們可以使用函數 read.table( )
讀取其中的數據,返回的是一個數據框。
write.table(patients, file = "patients.txt", sep = "\t", row.names = FALSE) patients.data <- read.table("patients.txt", header = TRUE) patients.data
在電子表格和數據庫應用中經常會生成帶分隔符的文本文件,其中.csv 文件是用逗號分隔取值(Comma Separated Values)。函數 read.csv( )
是函數 read.table( ) 的一個變體,專用於讀取 .csv 文件。 需要注意的是,read.table( ) 和 read.csv( ) 兩個函數中參數的默認值是不同的。在函數 read.table( ) 中,參數 header 默認值為 FALSE,即認為文件第一行開始就是數據而非變量名。而在函數 read.csv( )中,參數 header 默認值為 TRUE。因此,在讀入數據前,建議先打開原始文件進行查看,然后設置恰當的參數正確地讀入數據。例如:
write.csv(patients, "patients.csv", row.names=FALSE) patients.data <- read.csv("patients.csv") patients.data
8.2 xls 或 xlsx 格式
讀取電子表格數據有很多種方式,其中最簡單的方式是在 Excel 中將數據文件另存為一個逗號分隔(.csv)文件,然后用上述讀取.csv 文件的方法將其讀入R。還可以借助第三方包(例如 openxlsx 包、readxl 包和 gdata 包)直接讀取 xlsx 或 xls 格式的數據文件。
library(openxlsx) write.xlsx(patients, "patients.xlsx") patients.data <- read.xlsx("patients.xlsx", sheet = 1) patients.data
8.3 導出數據
由於 R 主要用於數據分析,導入文件比導出文件更常用,但有時我們也需要將數據或分析結果導出。函數 write.table( ) 和 write.csv( ) 可以分別將數據導出到一個 .txt 文件和 .csv 文件。
此外,函數 save( )
可以將工作空間中的指定對象保存為以 .rdata
為擴展名的 R 數據文件。例如:
save(patients.data, file = "patients.rdata")
rdata 格式文件占用空間小,用 R 讀入速度很快。建議在導入其他格式的數據並整理好后,將其保存為 rdata 格式。要導入這種格式的數據,只需調用 load( )
函數。
load("patients.rdata")
8.4 用 rio 包導入和導出數據
R 中的 rio 包以提供一個類似萬能工具的包為目標,用統一的 import( )
函數和 export( )
函數簡化了用戶導入和導出數據的工作。此外,該包里的 convert( )
函數可以實現不同文件格式之間的轉換。rio 包支持多種文件格式,包括 SAS、SPSS、Stata、Excel、MATLAB、Minitab 等其他軟件中使用的數據文件格式。 下面以 datasets 包里面的數據集 infert 為例介紹 rio 包的幾個常用功能。
library(rio) data("infert") str(infert)
函數 str( )
常用於查看數據集的大小(觀測的記錄數及變量個數),以及各個變量的類型。從上面的輸出可以看出,infert 是一個包含 248 個觀測記錄、每個記錄有 8 個變量的數據框。 運行下面的命令將此數據框導出為 .csv 文件:
export(infert, "infert.csv")
在當前工作目錄中可以找到剛才導出的名為 infert.csv
的數據文件。運行下面的命令將該文件從 .csv 文件轉換成 .sav 文件:
convert("infert.csv", "infert.sav")
然后用函數 import( )
把上面生成的 .sav 文件導入 R 中,並命名為 infert.data:
infert.data <- import("infert.sav")
函數(或數據集):
函數(或數據集) | 來源包 | 功能描述 |
---|---|---|
as.character( ) | base | 將對象轉換為字符串 |
as.factor( ) | base | 將對象轉換為因子 |
as.numeric( ) | base | 將對象轉換為數值 |
array( ) | base | 創建數組 |
bacteria | MASS | 數據集 |
boxplot( ) | graphics | 繪制箱線圖 |
c( ) | base | 創建向量 |
class( ) | base | 獲取對象的類型 |
colMeans( ) | base | 按列求均值 |
colSums( ) | base | 按列求和 |
convert( ) | rio | 轉換數據格式 |
data( ) | utils | 加載R |
data.frame( ) | base | 創建數據框 |
det( ) | base | 求矩陣的行列式 |
dim( ) | base | 獲取對象的維數 |
export( ) | rio | 將數據框導出為一個數據文件 |
factor( ) | base | 將一個向量轉換為因子 |
hist( ) | graphics | 繪制直方圖 |
import( ) | rio | 導入數據文件 |
infert | datasets | 數據集 |
iris | datasets | 數據集 |
is.logical( ) | base | 判斷對象是否為邏輯型 |
is.numeric( ) | base | 判斷對象是否為數值型 |
is.vector( ) | base | 判斷對象是否為向量 |
length( ) | base | 獲取對象的長度 |
levels( ) | base | 獲取因子的水平 |
list( ) | base | 創建列表 |
matrix( ) | base | 創建矩陣 |
read.csv( ) | utils | 讀取.csv |
read.dta( ) | foreign | 讀取Stata |
read.epiinfo( ) | foreign | 讀取EpiData |
read.spss( ) | foreign | 讀取SPSS |
read.table( ) | utils | 讀取文本格式數據文件 |
read.xlsx( ) | openxlsx | 讀取Excel |
read.xport( ) | foreign | 讀取SAS |
relevel( ) | stats | 改變因子水平的順序 |
rep( ) | base | 將對象重復顯示 |
rbinom( ) | stats | 生成服從二項分布的隨機數 |
rnorm( ) | stats | 生成服從正態分布的隨機數 |
rpois( ) | stats | 生成服從Poisson |
runif( ) | stats | 生成服從均勻分布的隨機數 |
rowMeans( ) | base | 按行求均值 |
rowSums( ) | base | 按行求和 |
save( ) | base | 將對象保存為R |
sd( ) | stats | 求樣本標准差 |
seq( ) | base | 生成有規則的序列 |
set.seed( ) | base | 設置生成隨機數的種子數 |
solve( ) | base | 求解矩陣方程 |
str( ) | utils | 顯示對象的內部結構 |
t( ) | base | 矩陣的轉置運算 |
var( ) | stats | 求樣本方差 |
View( ) | utils | 打開數據瀏覽窗口 |
write.csv( ) | utils | 將數據框導出到一個.csv |
write.table( ) | utils | 將數據框導出到一個文本文件 |