一、R語言—數據集創建


1. 向量

向量(vector)是用於存儲數值型、字符型、邏輯型數據的一維數組。標量可以看作是 只含有一個元素的向量。

函數c( )可用來創建向量,例如:

In [2]:
x1 <- c(2, 4, 1, -2, 5)
x2 <- c("one", "two", "three")
x3 <- c(TRUE, FALSE, TRUE, FALSE)

這里 x1 是數值型向量,x2 是字符型向量,而 x3 是邏輯型向量。每一個向量中的數據類型必須一致

 

如果想創建有規律的向量,R 提供了一些簡便的操作和函數,例如:

In [3]:
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 個數的值是多少呢?

In [4]:
x <- seq(from = 3, to = 100, by = 7)
x

3  10  17  24  31  38  45  52  59  66  73  80  87  94

In [5]:
x[5]
31
 

在方括號“[ ]”中的數字被稱為 下標,它指定向量的索引位置。在上面的命令里,x[5] 表示向量的第 5 個元素,其值為 31。

下面的命令顯示向量的第 4、第 6 和第 7 個元素:

In [6]:
x[c(4, 6, 7)]

24  38  45

 

下標中的向量可以取負值,表示去除指定位置上的元素。

例如,要去掉 x 的前4 個元素,可以輸入下面的代碼(注意命令里的括號):

In [7]:
x[-(1:4)]

31  38  45  52  59  66  73  80  87  94

 

R 中的運算都是向量化的,例如:

In [8]:
weight <- c(68, 72, 57, 90, 65, 81)
height <- c(1.75, 1.80, 1.65, 1.90, 1.72, 1.87)
bmi <- weight / height ^ 2
bmi

22.2040816326531  22.2222222222222  20.9366391184573  24.9307479224377  21.9713358572201  23.1633732734708

在上面計算 bmi 的過程中,運算符“^”被循環使用了,所以計算的結果仍然是一個向量。

 

如果參與運算的向量的長度不一致,R 會自動補全后計算,同時給出警告信息 。

In [9]:
a <- 1:5
b <- 1:3
a + b
Warning message in a + b:
“longer object length is not a multiple of shorter object length”

2  4  6  5  7

In [10]:
length(bmi)       # 計算向量bmi的長度
mean(bmi)           # 計算向量bmi的均值
var(bmi)            # 計算向量bmi的樣本方差
sd(bmi)           # 計算向量bmi的樣本標准差- c(1, 2, 1, 1, 2, 1, 2)
 
6
22.5714000044102
1.84126459887427
1.35693205389005
 

常用的統計函數

函數 描述
length(x) 求 x 中元素的個數
mean(x) 求 x 的算術平均值
median(x) 求 x 的中位數
var(x) 求 x 的樣本方差
sd(x) 求 x 的樣本標准差
range(x) 求 x 的全距
min(x) 求 x 的最小值
max(x) 求 x 的最大值
quantile(x) 求 x 的分位數
sum(x) 求 x 中所有元素的和
scale(x) 將 x 標准化

 

2. 因子

一般來說,變量有數值型、名義型和有序型之分。名義型變量是沒有順序關系的分類變量,例如人的性別、血型、民族等。而有序型變量是有層級和順序關系的分類變量,如患者的病情(較差、好轉、很好)。名義型變量和有序型變量在 R 中稱為因子(factor)。 因子在 R 中非常重要,它決定了數據的展示和分析方式。數據存儲時因子經常以整數向量形式存儲。

 

所以在進行數據分析之前,經常需要將它們用函數 factor( ) 轉換為因子。例如:

In [11]:
sex <- c(1, 2, 1, 1, 2, 1, 2) sex.f <- factor(sex, levels = c(1, 2), labels = c("Male", "Female")) sex.f

Male  Female  Male  Male  Female  Male  Female

 Levels: 'Male'  'Female'

上面的命令先定義了一個變量 sex 表示性別,假設其取值 1 表示男性,2 表示女性。接着用函數 factor( ) 將變量 sex 轉換成了因子並存為對象 sex.f,其中參數 levels 表示原變量的分類標簽值,參數 labels 表示因子取值的標簽。注意,這兩個參數在賦值時需要一一對應,R 會將它們相關聯。因子型變量與一般的字符型變量的區別就是它有一個水平(level)屬性。

 

因子的屬性可以使用函數 levels( ) 查看:

In [12]:
levels(sex.f)

'Male'  'Female'

 

改變因子水平的排列順序 → 改變參考組

在統計模型中,對於因子型變量,R 會將其第一個水平當作參考組。很多時候我們需要改變因子水平的排列順序以改變參考組,這可以通過兩種方法實現。

第一種方法是在函數 factor( ) 中改變參數 levels 和 labels 的排列順序,例如:

In [13]:
sex.f1 <- factor(sex, levels = c(2, 1), labels = c("Female", "Male")) sex.f1

Male  Female  Male  Male  Female  Male  Female

 Levels: 'Female'  'Male'
 
 

第二種方法是使用函數 relevel( )

In [14]:
sex.f1 <- relevel(sex.f, ref = "Female") sex.f1

Male  Female  Male  Male  Female  Male  Female

 Levels: 'Female'  'Male'

 

有序因子:ordered = TRUE

要表示有序因子,需要在函數 factor ( ) 里指定參數ordered = TRUE。例如:

In [15]:
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

Poor  Improved  Improved  Excellent  Poor  Improved  Improved

 Levels: 'Poor'  'Improved'  'Excellent'
 
 

3. 矩陣

矩陣(matrix)是一個由行和列組成的二維數組。矩陣里的每個元素具有相同的模式(數值型、字符型或邏輯型)。在大多數情況下,矩陣里的元素是數值型的,它具有很多數學特性和運算方式,可以用來進行統計計算,例如因子分析、廣義線性模型等。

創建:matrix( )

函數 matrix( ) 常用於創建矩陣,例如:

In [16]:
M <- matrix(1:6, nrow = 2) M
A matrix: 2 × 3 of type int
1 3 5
2 4 6

R 會根據向量的長度和參數 nrow 設定的行數自動計算列數。參數 byrow 默認為 FALSE,即按列將數值進行排列, 如果需要按行排列,只需將參數 byrow 設為TRUE。 常見的矩陣運算都可以在R 中實現,如矩陣加法、矩陣乘法、求逆矩陣、矩陣轉置、求方陣的行列式、求方陣的特征值和特征向量等。

相乘:%*%

矩陣乘法中要求第一個矩陣的列數等於第二個矩陣的行數,其運算符為 %*%。 先創建兩個矩陣:

In [17]:
mat1 <- matrix(1:6, nrow = 3) mat1 mat2 <- matrix(5:10, nrow = 2) mat2
A matrix: 3 × 2 of type int
1 4
2 5
3 6
 
A matrix: 2 × 3 of type int
5 7 9
6 8 10
In [18]:
# 函數dim( )可以得到矩陣的維數,即行數和列數
dim(mat1) dim(mat2)

3  2

2  3

結果表明,mat1 是一個 3 行 2 列的矩陣,mat2 是一個 2 行 3 列的矩陣,因此它們可以相乘,結果應該是一個 3 行 3 列的矩陣。

In [19]:
mat1 %*% mat2
A matrix: 3 × 3 of type dbl
29 39 49
40 54 68
51 69 87

轉置:t( )

矩陣的轉置運算就是把矩陣的行和列互換。例如,求矩陣 mat1 的轉置矩陣:

In [20]:
t(mat1)
A matrix: 2 × 3 of type int
1 2 3
4 5 6

行列式和逆矩陣:det( )、solver( )

求方陣的行列式和逆矩陣分別可以使用函數 det( ) 和函數 solve( ) 實現,例如:

In [21]:
mat3 <- matrix(1:4, nrow = 2) det(mat3)
-2

按行、列求和或者求平均:rowSums、colSums、rowMeans、ColMeans

例如:

In [22]:
rowSums(mat1)
colSums(mat1)
rowMeans(mat1)
colMeans(mat1)

5  7  9

6  15

2.5  3.5  4.5

2  5

 

4. 數組

通常所說的數組(array)指的是多維數組,它與矩陣類似,但是維數大於 2。數組有一個特殊的維數(dim)屬性。 下面的命令給一個向量加上維數后定義了一個數組,請注意數值的排列順序。 💡 由於 notebook 上顯示的數組不太美好,建議使用 print()。以下代碼在顯示數組時會額外加上 print()。

In [23]:
A <- 1:24 dim(A) <- c(3, 4, 2) A # notebook 上數組顯示不太正常,使用 print() 可以解決
print(A)

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24

, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

, , 2

     [,1] [,2] [,3] [,4]
[1,]   13   16   19   22
[2,]   14   17   20   23
[3,]   15   18   21   24

上面的數組還可以通過函數 array( ) 創建,並給各個維度添加名稱和標簽。

In [24]:
dim1 <- c("A1", "A2", "A3") dim2 <- c("B1", "B2", "B3", "B4") dim3 <- c("C1", "C2") print(array(1:24, dim = c(3, 4, 2), dimnames = list(dim1, dim2, dim3)))
, , C1

   B1 B2 B3 B4
A1  1  4  7 10
A2  2  5  8 11
A3  3  6  9 12

, , C2

   B1 B2 B3 B4
A1 13 16 19 22
A2 14 17 20 23
A3 15 18 21 24

5. 列表

列表(list)是 R 中最靈活也最復雜的一種數據結構,它可以由不同類型的對象混合組成。例如,它可以是向量、數組、表格和任意類型對象的組合

In [25]:
list1 <- list(a = 1, b = 1:5, c = c("red", "blue", "green")) list1
$a
1

$b

1  2  3  4  5

$c
'red'  'blue'  'green'
 
 

6. 數據框

數據框(dataframe)是一個由行和列組成的二維結構,其中行表示觀測(observation)或記錄(record),列表示變量(variable)或指標(indicator)。數據框與 Excel、SAS 和SPSS 中的數據集類似。數據框看起來與矩陣很相似,而且矩陣的很多操作也適用於數據框,如子集的選擇。 與矩陣不同的是,數據框里不同的列可以是不同模式(數值型、字符型等)的數據。數據框可以通過函數 data.frame( ) 創建。例如,下面的代碼創建了一個包含 5 個觀測對象、4 個變量的數據框:

In [29]:
ID <- 1:5 sex <- c("male", "female", "male", "female", "male") age <- c(25, 34, 38, 28, 52) pain <- c(1, 3, 2, 2, 3) pain.f <- factor(pain, levels = 1:3, labels = c("mild", "medium", "severe")) patients <- data.frame(ID, sex, age, pain.f) patients
A data.frame: 5 × 4
ID sex age pain.f
<int> <chr> <dbl> <fct>
1 male 25 mild
2 female 34 severe
3 male 38 medium
4 female 28 medium
5 male 52 severe
 

數據框本質上也是一種列表,要顯示或使用數據框的某一變量(列),可以使用 $ 符號加上變量名。例如:

In [30]:
patients$age
mean(patients$age)

25  34  38  28  52

35.4
 

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( ) 讀取其中的數據,返回的是一個數據框。

In [38]:
write.table(patients, file = "patients.txt", sep = "\t", row.names = FALSE) patients.data <- read.table("patients.txt", header = TRUE) patients.data
A data.frame: 5 × 4
ID sex age pain.f
<int> <chr> <int> <chr>
1 male 25 mild
2 female 34 severe
3 male 38 medium
4 female 28 medium
5 male 52 severe
 

在電子表格和數據庫應用中經常會生成帶分隔符的文本文件,其中.csv 文件是用逗號分隔取值(Comma Separated Values)。函數 read.csv( ) 是函數 read.table( ) 的一個變體,專用於讀取 .csv 文件。 需要注意的是,read.table( ) 和 read.csv( ) 兩個函數中參數的默認值是不同的。在函數 read.table( ) 中,參數 header 默認值為 FALSE,即認為文件第一行開始就是數據而非變量名。而在函數 read.csv( )中,參數 header 默認值為 TRUE。因此,在讀入數據前,建議先打開原始文件進行查看,然后設置恰當的參數正確地讀入數據。例如:

In [39]:
write.csv(patients, "patients.csv", row.names=FALSE) patients.data <- read.csv("patients.csv") patients.data
A data.frame: 5 × 4
ID sex age pain.f
<int> <chr> <int> <chr>
1 male 25 mild
2 female 34 severe
3 male 38 medium
4 female 28 medium
5 male 52 severe
 

8.2 xls 或 xlsx 格式

讀取電子表格數據有很多種方式,其中最簡單的方式是在 Excel 中將數據文件另存為一個逗號分隔(.csv)文件,然后用上述讀取.csv 文件的方法將其讀入R。還可以借助第三方包(例如 openxlsx 包、readxl 包和 gdata 包)直接讀取 xlsx 或 xls 格式的數據文件。 

In [40]:
library(openxlsx) write.xlsx(patients, "patients.xlsx") patients.data <- read.xlsx("patients.xlsx", sheet = 1) patients.data
A data.frame: 5 × 4
  ID sex age pain.f
  <dbl> <chr> <dbl> <chr>
1 1 male 25 mild
2 2 female 34 severe
3 3 male 38 medium
4 4 female 28 medium
5 5 male 52 severe
 
 

8.3 導出數據

由於 R 主要用於數據分析,導入文件比導出文件更常用,但有時我們也需要將數據或分析結果導出。函數 write.table( ) 和 write.csv( ) 可以分別將數據導出到一個 .txt 文件和 .csv 文件。  

此外,函數 save( ) 可以將工作空間中的指定對象保存為以 .rdata 為擴展名的 R 數據文件。例如:

In [43]:
save(patients.data, file = "patients.rdata")

 rdata 格式文件占用空間小,用 R 讀入速度很快。建議在導入其他格式的數據並整理好后,將其保存為 rdata 格式。要導入這種格式的數據,只需調用 load( ) 函數。

In [44]:
load("patients.rdata")

 

8.4 用 rio 包導入和導出數據

R 中的 rio 包以提供一個類似萬能工具的包為目標,用統一的 import( ) 函數和 export( ) 函數簡化了用戶導入和導出數據的工作。此外,該包里的 convert( ) 函數可以實現不同文件格式之間的轉換。rio 包支持多種文件格式,包括 SAS、SPSS、Stata、Excel、MATLAB、Minitab 等其他軟件中使用的數據文件格式。 下面以 datasets 包里面的數據集 infert 為例介紹 rio 包的幾個常用功能。 

In [45]:
library(rio) data("infert") str(infert)
'data.frame':	248 obs. of  8 variables:
 $ education     : Factor w/ 3 levels "0-5yrs","6-11yrs",..: 1 1 1 1 2 2 2 2 2 2 ...
 $ age           : num  26 42 39 34 35 36 23 32 21 28 ...
 $ parity        : num  6 1 6 4 3 4 1 2 1 2 ...
 $ induced       : num  1 1 2 2 1 2 0 0 0 0 ...
 $ case          : num  1 1 1 1 1 1 1 1 1 1 ...
 $ spontaneous   : num  2 0 0 0 1 1 0 0 1 0 ...
 $ stratum       : int  1 2 3 4 5 6 7 8 9 10 ...
 $ pooled.stratum: num  3 1 4 2 32 36 6 22 5 19 ...
 

函數 str( ) 常用於查看數據集的大小(觀測的記錄數及變量個數),以及各個變量的類型。從上面的輸出可以看出,infert 是一個包含 248 個觀測記錄、每個記錄有 8 個變量的數據框。 運行下面的命令將此數據框導出為 .csv 文件:

In [46]:
export(infert, "infert.csv")

在當前工作目錄中可以找到剛才導出的名為 infert.csv 的數據文件。運行下面的命令將該文件從 .csv 文件轉換成 .sav 文件:

In [47]:
convert("infert.csv", "infert.sav")

然后用函數 import( ) 把上面生成的 .sav 文件導入 R 中,並命名為 infert.data:

In [48]:
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 將數據框導出到一個文本文件
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM