僅用於記錄R語言學習過程:
內容提要:
列表:list()函數;元素的提取
矩陣:matrix()函數及其中的參數設置;矩陣轉置
數組:array()函數;dim()函數
數據框:data.frame()函數;str()函數 ;$ :增刪列;修改數據框數據函數:edit()和fix();查看數據結構的函數:head()和tail();數據框的基本操作:行合並(rbind()函數)、列合並(cbind()函數)、merge()函數;數據框的切分:sample()函數、split()函數、subset()函數和[ ](方括號)。
正文:
注:內容中行首看不懂的字符如n,是由於寫筆記時在word中選用不同級別的項目符號造成的,可忽略。
第四節 列表與矩陣
list()函數:用於生成列表和清單的函數,囊括了數字,字符串,邏輯型變量
> my_list<- list(1,2,3,"R","nihao",TRUE,FALSE)
> my_list
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] "R"
[[5]]
[1] "nihao"
[[6]]
[1] TRUE
[[7]]
[1] FALSE
[] 提取元素
list中提取元素
> my_list2 <- list(1:10,letters[1:5])
> my_list2
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] "a" "b" "c" "d" "e"
> my_list2[1]
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
> class(my_list2 [1])
[1] "list"
> my_list2 [[1]]
[1] 1 2 3 4 5 6 7 8 9 10
> class (my_list2[[1]])
[1] "integer"
> my_list2[[2]]
[1] "a" "b" "c" "d" "e"
> my_list2[[2]][1]
[1] "a" 找到小寫字母a
list中可以包含一個list
> my_list3 <- list(1:10,letters[1:5],list(11:14,LETTERS[1:5]))
> my_list3 [[3]][2][1]
[[1]]
[1] "A" "B" "C" "D" "E"
> my_list3 [[3]][[2]][1]
[1] "A"
矩陣(matrix) :由M行和N列構成的數表
n 用matrix() 函數:參數設置:data為擬傳入的數值;nrow定義矩陣的行數;byrow按行排列,默認為FALSE;ncol代表定義矩陣的列數;對行和列進行命名:dimnames接受一個列表list,把行名寫在前面,列名寫在后面,用c()生成函數
> my_matrix <- matrix(data=1:6, nrow = 2,byrow = TRUE)
> my_matrix
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> my_matrix2 <- matrix(data = 1 :10, nrow = 5)
> my_matrix2
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
> my_matrix3 <- matrix(data = 2,nrow = 3,ncol = 4)
> my_matrix3
[,1] [,2] [,3] [,4]
[1,] 2 2 2 2
[2,] 2 2 2 2
[3,] 2 2 2 2
> my_matrix4 <- matrix(data = letters[1:3],nrow = 2,ncol = 4)
Warning message:
In matrix(data = letters[1:3], nrow = 2, ncol = 4) :
data length [3] is not a sub-multiple or multiple of the number of rows [2]
> my_matrix4
[,1] [,2] [,3] [,4]
[1,] "a" "c" "b" "a"
[2,] "b" "a" "c" "b"
> my_matrix4 <- matrix(data = letters[1:3],nrow = 2,ncol = 4,byrow = TRUE)
Warning message:
In matrix(data = letters[1:3], nrow = 2, ncol = 4, byrow = TRUE) :
data length [3] is not a sub-multiple or multiple of the number of rows [2]
> my_matrix4
[,1] [,2] [,3] [,4]
[1,] "a" "b" "c" "a"
[2,] "b" "c" "a" "b"
對矩陣的行和列進行命名:dimnames接受一個列表,把行名寫在前面,列名寫在后面,用c()生成函數
> my_matrix5 <- matrix(data = 1:12,nrow = 3,ncol = 4,dimnames = list(c("A","B","C"),c("V1","V2","V3","V4")))
> my_matrix5
V1 V2 V3 V4
A 1 4 7 10
B 2 5 8 11
C 3 6 9 12
n 轉置函數t() 作用:對調行與列
> t(my_matrix5)
A B C
V1 1 2 3
V2 4 5 6
V3 7 8 9
V4 10 11 12
n 包含字符串的矩陣
> my_matrix6 <- matrix(c(1:5,letters [1:5]), nrow =2)
> my_matrix6
[,1] [,2] [,3] [,4] [,5]
[1,] "1" "3" "5" "b" "d"
[2,] "2" "4" "a" "c" "e"
> t(my_matrix6)
[,1] [,2]
[1,] "1" "2"
[2,] "3" "4"
[3,] "5" "a"
[4,] "b" "c"
[5,] "d" "e"
第五節:數組與初識數據框
數組:用array()函數:參數設置:data;dim表示維度,用c()生成,如c(2,4,3) 代表2行,4列,3層;給數組命名:dimnames 同矩陣,接受一個list,c()生成,行名、列名、層名
n 數組與矩陣的關系:矩陣為一個二維的數組,數組是多維的矩陣,因為包含層的概念
> my_array <- array(data = 1:16,dim = c(2,4,2))
> my_array
, , 1(第一層)
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
, , 2(第二層)
[,1] [,2] [,3] [,4]
[1,] 9 11 13 15
[2,] 10 12 14 16
> dim(my_array)
[1] 2 4 2
n dim()函數可用於改變數組的行、列、層
> dim(my_array) <- c(4,2,2)
> my_array
, , 1
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
, , 2
[,1] [,2]
[1,] 9 13
[2,] 10 14
[3,] 11 15
[4,] 12 16
> my_array2 <- array(1:16,dim= c(4,2,2),dimnames = list(c(LETTERS[1:4]),c("col1","col2"),c("first","second")))
> my_array2
, , first
col1 col2
A 1 5
B 2 6
C 3 7
D 4 8
, , second
col1 col2
A 9 13
B 10 14
C 11 15
D 12 16
n 提取數組中的元素:提取更高維度數據結構的元素 [],逗號前為行的下標,逗號后為列的下標。
> my_matrix <- matrix(1:8,nrow = 4)
> my_matrix
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> my_matrix[4,2]
[1] 8
> my_matrix[3]
[1] 3
> my_matrix[3,]
[1] 3 7
> my_matrix[,1]
[1] 1 2 3 4
> my_array2[2,2,1]
[1] 6
> my_array2[,1,1]
A B C D (行名)
1 2 3 4
> my_array[,1,1]
[1] 1 2 3 4
注:如果超出邊界會報錯。
數據框
n data.frame()用於生成數據框,參數設置:傳入的是每一列的列名,每一列的內容通過c()函數生成,可以包含字符串、數字和邏輯判斷,如:
> my_df <- data.frame(names=c("TOM","ANDY","MARRY"),age = c(24,25,26),height =c(178,176,T))
> my_df
names age height
1 TOM 24 178
2 ANDY 25 176
3 MARRY 26 T
n 列名不合法的:如,1age, 11,my +-\* 等運算符
合法的列名:df_1 df_a
數字不出現在第一位,
n 查詢數據框的行列情況,用dim()函數; 還可以使用View()函數,V是大寫的,用來顯示數據框的內容(會在代碼框中彈出表格),View(iris)也會彈出一個數據集; 可以使用nrow()函數和ncol()函數顯示有幾行幾列。
> dim(my_df)
[1] 3 3
> View(my_df)
> nrow(my_df)
[1] 3
> ncol(my_df)
[1] 3
n 數據框的生成:列名下的數據個數需一致,否則會報錯
> my_df <- data.frame(one = c(1.2,2.3,3.4,4.5,5.6),two = LETTERS[1:5],three = c(T,F,T,F,T))
> my_df
one two three
1 1.2 A TRUE
2 2.3 B FALSE
3 3.4 C TRUE
4 4.5 D FALSE
5 5.6 E TRUE
> my_df <- data.frame(one = c(1.2,2.3,3.4,4.5,5.6),two = LETTERS[1:4],three = c(T,F,T,F,T))
Error in data.frame(one = c(1.2, 2.3, 3.4, 4.5, 5.6), two = LETTERS[1:4], :
參數值意味着不同的行數: 5, 4
n str() 函數,用於查看數據框的結構,返回值見下,obs指的是觀測值,varialbes指的是變量,具體內容中返回每一列,數據類型屬於哪種,具體的數據有哪些;不把字符串變成因子:在data.frame生成過程中設置參數stringsAsFactors = FALSE
> str(my_df)
'data.frame': 5 obs. of 3 variables:
$ one : num 1.2 2.3 3.4 4.5 5.6
$ two : Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5 (擬傳入的是字符串)
$ three: logi TRUE FALSE TRUE FALSE TRUE
> my_df <- data.frame(one = c(1.2,2.3,3.4,4.5,5.6),two = c("Tom","andy","mary","bob","leo"),three = c(T,F,T,F,T))
> str(my_df)
'data.frame': 5 obs. of 3 variables:
$ one : num 1.2 2.3 3.4 4.5 5.6
$ two : Factor w/ 5 levels "andy","bob","leo",..: 5 1 4 2 3
$ three: logi TRUE FALSE TRUE FALSE TRUE
> my_df <- data.frame(one = c(1.2,2.3,3.4,4.5,5.6),two = c("Tom","andy","mary","bob","leo"),three = c(T,F,T,F,T),stringsAsFactors = FALSE) 不把字符串變成因子
> str(my_df)
'data.frame': 5 obs. of 3 variables:
$ one : num 1.2 2.3 3.4 4.5 5.6
$ two : chr "Tom" "andy" "mary" "bob" ... (character)
$ three: logi TRUE FALSE TRUE FALSE TRUE
n 去除不想要的列 兩種方法:
方法一:用[ ] ,括號用減號-,寫明需要去掉的列,如第二列
> my_df [,-2]
one three
1 1.2 TRUE
2 2.3 FALSE
3 3.4 TRUE
4 4.5 FALSE
5 5.6 TRUE
方法二:my_df $,后面會自動彈出需要去除的列。$通常用於提取子集,很常用。
> my_df$two <- NULL(表示為空,不占據位置,與NA不同,NA是缺失值,但是也要占據一個位置)
> my_df
one three
1 1.2 TRUE
2 2.3 FALSE
3 3.4 TRUE
4 4.5 FALSE
5 5.6 TRUE
n 數據框新增列,同樣用$
> my_df$four <- LETTERS[1:5]
> my_df
one three four
1 1.2 TRUE A
2 2.3 FALSE B
3 3.4 TRUE C
4 4.5 FALSE D
5 5.6 TRUE E
n 修改數據框中生成的數據: edit()函數和fix()函數
u edit(my_df) 會生成一個表,(mac系統可能需要安裝XQuartz插件)但是是一次性操作,只改一次,原始數據不會改,此時需要把改完后的對話框賦予一個新的數據框my_df2
> edit(my_df)
one three four
1 1.2 TRUE A
2 2.3 FALSE B
3 3.4 TRUE C
4 4.5 FALSE D
5 5.6 TRUE F
> my_df
one three four
1 1.2 TRUE A
2 2.3 FALSE B
3 3.4 TRUE C
4 4.5 FALSE D
5 5.6 TRUE E
> my_df2 <- edit(my_df)
> my_df2
one three four
1 1.2 TRUE A
2 2.3 FALSE B
3 3.4 TRUE C
4 4.5 FALSE D
5 5.6 TRUE F
u fix()函數(永久性更改數據,即更改了原數據)
> fix(my_df)
> my_df
one three four
1 1.2 TRUE A
2 2.3 FALSE B
3 3.4 TRUE C
4 4.5 FALSE D
5 5.6 TRUE F
n 快速查看數據結構:head()函數:參數設置:文件名,n可以設置擬看的行數
默認查看前六行,n值可以更改
n 快速查看數據結構:tail()函數:參數設置:文件名,n可以設置擬看的行數
默認查看后六行,n值可以更改
| > head(iris,n=5) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa > tail(iris) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 145 6.7 3.3 5.7 2.5 virginica 146 6.7 3.0 5.2 2.3 virginica 147 6.3 2.5 5.0 1.9 virginica 148 6.5 3.0 5.2 2.0 virginica 149 6.2 3.4 5.4 2.3 virginica 150 5.9 3.0 5.1 1.8 virginica |
> library(psych) #加載psych包 里面有一個describe()函數
> describe(iris) #描述iris,查看數據框中更多的內容 mad眾數;skew 偏度 kurtosis 豐度
vars n mean sd median trimmed mad min max
Sepal.Length 1 150 5.84 0.83 5.80 5.81 1.04 4.3 7.9
Sepal.Width 2 150 3.06 0.44 3.00 3.04 0.44 2.0 4.4
Petal.Length 3 150 3.76 1.77 4.35 3.76 1.85 1.0 6.9
Petal.Width 4 150 1.20 0.76 1.30 1.18 1.04 0.1 2.5
Species* 5 150 2.00 0.82 2.00 2.00 1.48 1.0 3.0
range skew kurtosis se
Sepal.Length 3.6 0.31 -0.61 0.07
Sepal.Width 2.4 0.31 0.14 0.04
Petal.Length 5.9 -0.27 -1.42 0.14
Petal.Width 2.4 -0.10 -1.36 0.06
Species* 2.0 0.00 -1.52 0.07
> names(iris) #查看變量名
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
[5] "Species"
> names(iris) <- c("V1","V2","V3","V4","V5") #修改變量名,不支持漢字,需要UTF-8,且運行一個函數“Sys.setlocale(category = “LC_CTYPE”,locale= “zh_CN.UTF-8”) “ 現在已支持 Windows 系統的代碼是 Sys.setlocale(locale =”chinese”)
> names(iris)
[1] "V1" "V2" "V3" "V4" "V5"
> head(iris)
V1 V2 V3 V4 V5
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
數據框的基本操作
n 列合並:cbind :c 是指column ,列綁定,直接鍵入兩個需要合並的數據框即可,但是注意兩個數據框的行數需一致,否則會報錯。如下:
> my_df <- data.frame(one=c("張三","ANDY","MARRY"),two = c(24,25,26),three =c(178,176,'T'))
> my_df2 <-data.frame(four=c("張三","ANDY","MARRY"),five = c(24,25,26),six =c(178,176,'T'))
> my_df3 <- cbind(my_df,my_df2)
> my_df3
one two three four five six
1 張三 24 178 張三 24 178
2 ANDY 25 176 ANDY 25 176
3 MARRY 26 T MARRY 26 T
n 行合並:rbind: r是指row,bind綁定。需注意的是要合並的數據框必須具有相同的變量名,不考慮變量的行數(觀測量)是否一致。
> my_df4 <- data.frame(one=c("張三","ANDY","amy"),two = c(24,25,26),three =c(178,176,'T'))
> my_df5 <- rbind(my_df,my_df4)
> my_df5
one two three
1 張三 24 178
2 ANDY 25 176
3 MARRY 26 T
4 張三 24 178
5 ANDY 25 176
6 amy 26 T
n merge()函數,可以用來合並兩個數據框,根據至少一個相同的變量。參數設置:x:其中一個數據框;y:另一個數據框,by:指根據什么來合並,如‘one’,不寫by也行;all的默認參數是FALSE
> my_df6 <- data.frame(one=c("張三","ANDY","MARRY"),seven = c(24,25,26),eight =c(178,176,'T'))
> my_df7 <- merge(my_df,my_df6)
> my_df7
one two three seven eight
1 ANDY 25 176 25 176
2 MARRY 26 T 26 T
3 張三 24 178 24 178
n 數據框的切分
n sample()函數:隨機抽樣。參數設置:x:抽樣的范圍,如1:nrow(iris)(即返回行的數量);size 大小,表示要抽取的個數,replace:代替。如果size大於x,就需要用replace;prob是用於設置概率的
View(iris)
sample(1:nrow(iris),30)
iris_sub <- iris[sample(1:nrow(iris),30),] #用了提取的[],同時在30括號外加了逗號,表示是對於行取的隨機
iris_sub
u 設置種子,即兩次隨機生成的變量產生的變量相同。用set.seed()函數,為了方便后續可重復性操作,先運行種子,然后運行產生隨機數,后面再次運行產生隨機數前,再次先運行一遍種子。如set.seed(20)
n split()函數:切分;參數設置,x是指需切分的數據框,f是指factor的縮寫,根據因子進行切分,格式為f = 數據框名$列名,drop默認值為FALSE,設置為TRUE的話會把原始數據框中的因子水平去掉,保留現在的因子水平
split(iris,f = iris$e)
iris_sub2 <-split(iris,f = iris$e)
setosa <- as.data.frame(iris_sub2[1]) #轉換成數據框
head(setosa)
n 用[] 提取,最常用 比較精細 如:
iris_sub3 <- iris[iris$e =='setosa',]
head(iris_sub3)
同樣,也可以在方括號里添加邏輯表達式:
iris_sub3 <- iris[iris$e =='setosa'& iris$a > 4.5,1:2] #1:2,代表顯示前兩列
head(iris_sub3)
range(iris_sub3$a) #顯示范圍
n subset()函數:子集 x:數據框,subset= 需傳入待篩選的條件,select = 指對列進行選擇 很常用的函數
iris_sub4 <- subset(iris,iris$e =='setosa'& iris$a > 4.5,select=1:2)
iris_sub4
identical(iris_sub3,iris_sub4) #返回為TRUE,說明iris_sub3和iris_sub4是一樣的
