1. 程式人生 > >R語言的資料結構

R語言的資料結構

R共有6種儲存資料的物件型別

  • 向量
  • 列表
  • 陣列
  • 資料框
  • 矩陣
  • 因子

R中的資料結構

向量(Vectors)

向量是用於儲存數值型、字元型或邏輯型資料的一維陣列。執行組合功能的函式c()可用來建立向量。

# 建立一個向量
apple <- c('red','green',"yellow")
num <- c(12, 23, 34, 56, 78, 83)
print(apple)
print(num)

# 查看向量的型別.
print(class(apple))
[1] "red"    "green"  "yellow"
[1] 12 23 34 56 78 83
[1] "character"

** !!! 單個向量中,資料的型別必須是相同的**

# 向量元素的選取

# 與其他程式語言索引從0計數不同的是,R語言的索引從1開始計數
num[1]

# 選取多個元素
num[1:3]

# 索引前加 - 號代表除去這個元素的其他元素,可以看到結果中沒有第二個元素
apple[-2]

# 選取除了第2個和第3個元素外的其他元素
num[-(2:3)]  
12
12 23 34
'red' 'yellow'
12 56 78 83

矩陣(Matrix)

矩陣是一個二維陣列,只是每個元素都擁有相同的模式(數值型、字元型或邏輯型)。可通過函式matrix建立矩陣。

# matrix(data = ,nrow = n,ncol = n,byrow = ,dimnames =list(row_vector,col_vector) )
# data包含了矩陣的元素
# nrow和ncol用以指定行和列的維數
# dimnames包含了可選的、以字元型向量表示的行名和列名
# byrow則表明矩陣應當按行填充(byrow=TRUE)還是按列填充(byrow=FALSE),預設情況下按列填充。

# Create a matrix.
M = matrix( num, nrow = 2, ncol = 3, byrow = TRUE, dimnames = list(c('人口','面積'),c('北京','廣州', '上海')))
print(M)
     北京 廣州 上海
人口   12   23   34
面積   56   78   83
M1 <- matrix(1:20, nrow=5, ncol=4)
print(M1)
     [,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
# 矩陣元素選取

# 選取列
M1[,2]

# 選取行
M1[1,]

# 選取單個元素
M1[3,4]

# 選取符合要求的元素
M1[M1>10]
6 7 8 9 10
1 6 11 16
18
11 12 13 14 15 16 17 18 19 20

資料框(data frame)

資料框是表格資料物件。與矩陣一樣都是二維的,但是不同的是每列可以包含不同的資料模式。 第一列可以是數字,而第二列可以是字元,第三列可以是邏輯的。它是等長度的向量的列表。

df <- data.frame(
   gender = c("Male", "Male","Female"), 
   height = c(152, 171.5, 165), 
   weight = c(81,93, 78),
   Age = c(42,38,26)
)
df
gender height weight Age
Male 152.0 81 42
Male 171.5 93 38
Female 165.0 78 26
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)
patientdata
patientID age diabetes status
1 25 Type1 Poor
2 34 Type2 Improved
3 28 Type1 Excellent
4 52 Type1 Poor
# 索引列
print(df$gender)
print(df[,2])
print(df[1:2])
print(df[['Age']])
[1] Male   Male   Female
Levels: Female Male
[1] 152.0 171.5 165.0
  gender height
1   Male  152.0
2   Male  171.5
3 Female  165.0
[1] 42 38 26
# 索引行
print(df[2:3,])
  gender height weight Age
2   Male  171.5     93  38
3 Female  165.0     78  26
# 特定條件索引
df[df$Age > 30]
gender height Age
Male 152.0 42
Male 171.5 38
Female 165.0 26
# 索引元素
print(patientdata[1,3])   # 第一列第三行

print(df$Age[1])    # Age列第一行

print(df[[2]][1])  # 第二列第一行

print(df[['Age']][1])  # Age列第一行
[1] Type1
Levels: Type1 Type2
[1] 42
[1] 152
[1] 42
# 生成成糖尿病型別變數diabetes和病情變數status的列聯表
table(patientdata$diabetes, patientdata$status)
        Excellent Improved Poor
  Type1         1        0    2
  Type2         0        1    0

陣列(Array)

雖然矩陣被限制為二維,但陣列可以具有任何數量的維度。 陣列函式使用一個dim屬性建立所需的維數。 在下面的例子中,我們建立了一個包含兩個元素的陣列,每個元素為3x3個矩陣。

# Create an array.
a <- array(c('green','yellow'),dim = c(3,3,2))
print(a)
, , 1

     [,1]     [,2]     [,3]    
[1,] "green"  "yellow" "green" 
[2,] "yellow" "green"  "yellow"
[3,] "green"  "yellow" "green" 

, , 2

     [,1]     [,2]     [,3]    
[1,] "yellow" "green"  "yellow"
[2,] "green"  "yellow" "green" 
[3,] "yellow" "green"  "yellow"
dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2", "B3")
dim3 <- c("C1", "C2", "C3", "C4")
z <- array(1:24, c(2,3,4), dimnames=list(dim1, dim2, dim3))
print(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

陣列的索引同矩陣,只不過下標從2個變成了3個,陣列同矩陣一樣,資料型別必須一樣

因子(Factors)

我們都知道,變數的型別可以分為如下幾種

  • 類別變數(定性變數)
    • 無序類別變數(名義值):類別無法排序,沒有順序關係,比如行業類別,性別
    • 有序類別變數(順序值):類別之間有順序關係,比如等級,評價‘差’,‘一般’,‘很好’
  • 數值變數(定量變數)
    • 離散變數(有限值): 只能去有限個值的變數,可以一一列舉。
    • 連續變數(無限值):在一個或多個區間內取任何值,連續不斷不可一一列舉,比如溫度,身高。

類別變數在R中被稱為因子,函式factor()以一個整數向量的形式儲存類別值,整數的取值範圍是[1-k ](其中k 是名義型變數中唯一值的個數),同時一個由字串(原始值)組成的內部向量將對映到這些整數上。這種做法類似於python特徵分子中的將類別變數dummy化

對於有序變數,我們還可以指定變數對應的編碼,使編碼與邏輯順序相一致,比如low,mid,high對應1,2,3

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 <- factor(diabetes)
status <- factor(status, order=TRUE)  # order=TRUE R將此變數當做有序變數對待
patientdata <- data.frame(patientID, age, diabetes, status)
str(patientdata)   # 資料的資訊,相當於pandas中的info
summary(patientdata)  # 描述性統計
# 可以看到,描述性統計中,R對數值型分析了最大最小值等,而對因子採用了頻數統計。
'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 1
 $ status   : Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3



   patientID         age         diabetes       status 
 Min.   :1.00   Min.   :25.00   Type1:3   Excellent:1  
 1st Qu.:1.75   1st Qu.:27.25   Type2:1   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                          
# 如果變數的預設順序不是按照邏輯順序排列的,比如status如果是按照improved,poor,excellent排列,
# 那麼預設的順序就無法代表真實邏輯順序。
# 因此,可以新增levels變數
status <- factor(status,order=TRUE,levels = c("poor", "improved", "excellent"))
# 這樣就相當於指定了順序,任何在資料中出現而未在引數中列舉的資料都將被設為缺失值

列表

R中的列表比較像python中的列表,列表中的元素可以是單個字元,數值,也可以是向量,矩陣,陣列等
列表就是一些物件的有序集合

# Create a list.
list1 <- list(c(2,5,3),21.3,sin)

# Print the list.
print(list1)
[[1]]
[1] 2 5 3

[[2]]
[1] 21.3

[[3]]
function (x)  .Primitive("sin")
g <- "My First List"
h <- c(25, 26, 18, 39)
j <- matrix(1:10, nrow=5)
k <- c("one", "two", "three")
mylist <- list(title=g, ages=h, j, k)
print(mylistlist)
$title
[1] "My First List"

$ages
[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"
mylist[['ages']]  # 輸出ages
mylist[[2]]   # 輸出第二個元素
25 26 18 39
25 26 18 39

處理資料的常用函式

length(object) 
# 顯示物件中元素/成分的數量

dim(object)     
# 顯示某個物件的維度

str(object)     
# 顯示某個物件的結構

class(object)     
# 顯示某個物件的類或型別

mode(object)     
# 顯示某個物件的模式

names(object)     
# 顯示某物件中各成分的名稱

c(object, object,…)     
# 將物件合併入一個向量

cbind(object, object, …) 
# 按列合併物件

rbind(object, object, …) 
# 按行合併物件

Object 
# 輸出某個物件

head(object) 
# 列出某個物件的開始部分

tail(object) 
# 列出某個物件的最後部分

ls() 
# 顯示當前的物件列表

rm(object, object, …) 
# 刪除一個或更多個物件。語句rm(list = ls())將刪除當前工作環境中的幾乎所有物件,以句點.開頭的隱藏物件將不受影響

newobject <- edit(object) 
# 編輯物件並另存為newobject

fix(object) 
# 直接編輯物件