天天看點

covariance matrix r語言_快速掌握R語言中類SQL資料庫操作技巧

在資料分析中,往往會遇到各種複雜的資料處理操作:分組、排序、過濾、轉置、填充、移動、合并、分裂、去重、找重、填充等操作。這時候R語言就是一個很好的選擇:R可以高效地、優雅地解決資料處理操作。(本章節為R語言入門第二部分總結篇:資料操作)

本章内容布局思路:思來想後,想到SQL查詢的查詢思路可以作為本章節的布局思路

  • 1.了解表結構/資料結構
  • 2.對表中的一些資料做出修改、替換、甚至生成新字段
  • 3.from:資料合并/連接配接
  • 4.where:條件篩選/過濾
  • 5.group:分組
  • 6.having和select:呈現不明顯
  • 7.order:排序
  • 8.其他補充

目錄 1. 初識R語言支援的資料類型

1.1 向量 Vector : c()

1.2 矩陣 Matrix: matrix()

1.3 資料框 DataFrame: data.frame()

1.4 時間序列 XTS: xts()

1.5 因子Factor:factor(補充)

2.檢視資料概況

summary()和str()

3.修改/替換/重定義資料 4.資料合并

3.1 向量合并

3.2 cbind列合并(等長)

3.3 rbind行合并

3.4 merge

3.5 補充:集合操作

4.過濾/篩選

4.1 缺失值處理

4.2 資料增減

4.3 數值分段cut

5.分組操作

5.1 aggregate文法

5.2 aggregate分組計算

5.3 aggregate分組計算(formula形式)

6. 排序order 7. 計數table 8. 分裂split 9. 去重與找重unique 10.轉置

1. 初識R語言支援的資料類型

開始之前,需要先了解一下R語言支援的資料類型,以及這些常用類型的特點。以下4種類型是最常用的:向量、矩陣、資料框、時間序列。

可參考↓↓ R語言|第2講:生成資料 R語言快速入門:資料結構+生成資料+資料引用+讀取外部資料

  • 向量 Vector : c()
  • 矩陣 Matrix: matrix()
  • 資料框 DataFrame: data.frame()
  • 時間序列 XTS: xts()
  • 因子Factor:factor(補充)
covariance matrix r語言_快速掌握R語言中類SQL資料庫操作技巧

(圖檔來自于粉絲日志) 1.1 向量 Vector : c()

> x > x [1]  1  2  3  4  5  6  7  8  9 10
           

1.2 矩陣 Matrix: matrix()

#矩陣用法matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL) #表示生成1行,1列的一個矩陣,其中僅僅包含一個元素“NA”#---示例---#> matrix(c(1,2,3, 11,12,13), nrow = 2, ncol = 3, byrow = TRUE, dimnames = list(c("row1", "row2"), c("C.1", "C.2", "C.3")))     C.1 C.2 C.3row1   1   2   3row2  11  12  13#nrow = 2和ncol = 3 定義2x3的2行3列矩陣#byrow = TRUE 是控制矩陣中的資料c(1,2,3, 11,12,13)按照行的順序排列,預設按照列排列#dimnames = list(c("row1", "row2"), c("C.1", "C.2", "C.3")) 定義矩陣行名和列名
           

1.3 資料框 DataFrame: data.frame()

#其中" > x :15)  > y :5) #将向量x和y合并存儲到資料框中,并重命名為xf和yf> data.frame(xf = x, yf = y)   xf yf1  11  12  12  23  13  34  14  45  15  5
           

1.4 時間序列 XTS: xts()

covariance matrix r語言_快速掌握R語言中類SQL資料庫操作技巧
> library(xts)> x 11:> xts(x,order.by=as.Date('2019-09-14')+1:5)           [,1]2019-09-15   112019-09-16   122019-09-17   132019-09-18   142019-09-19   15
           

關于xts類型的詳細介紹,請參考文章《可擴充的時間序列xts》http://blog.fens.me/r-xts/

1.5 因子Factor:factor(補充)可以了解為分類變量
           

2.檢視資料概況

在R中檢視資料概況的函數常用summary()和str()。

其中,summary更多的是描述統計,傳回:最大最小、四分位數、均值、中位數等;而str更多的是檢視資料(變量)結構,傳回:資料集次元數,列變量類型等。summary()和str()結合使用可以對資料概況作出初步了解。
           
> data(iris)> head(iris,10)   Sepal.Length Sepal.Width Petal.Length Petal.Width Species1           5.1         3.5          1.4         0.2  setosa2           4.9         3.0          1.4         0.2  setosa3           4.7         3.2          1.3         0.2  setosa4           4.6         3.1          1.5         0.2  setosa5           5.0         3.6          1.4         0.2  setosa6           5.4         3.9          1.7         0.4  setosa7           4.6         3.4          1.4         0.3  setosa8           5.0         3.4          1.5         0.2  setosa9           4.4         2.9          1.4         0.2  setosa10          4.9         3.1          1.5         0.1  setosa> summary(iris)  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species   Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50   1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50   Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50   Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                   3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                   Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500                  > str(iris)'data.frame':  150 obs. of  5 variables: $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
           

3.修改/替換/重定義資料

修改指定單元格,修改指定列,within 關聯修改

leadership$age[leadership$age==99] leadership$agecat2 leadership agecat2[age>75] "Elder"  agecat2[age>=55 & age<=75] "Middle Aged"  agecat2[age<55] )
           

4 資料合并

資料操作中,資料(集)合并是經常被用到。例如:合并來源不同,結構相似的兩個表格 3.1 向量合并

#一維向量合并直接将要合并的變量以","分割放到c()中即可。> x > y > c(x,y) [1] 11 12 13 14 15 16 17 18 19 20  1  2  3  4  5  6  7  8  9 10
           

3.2 cbind列合并(等長)

總結:cbind等行數、按列合并(無序)

#生成測試資料> ID1 > ID2 > name> score> student1> student2#按照行合并student1和student2> cbind(student1,student2)   ID1 name ID2 score1   1    A   2     82   2    B   3    223   3    C   4     74   4    D   5     6
           

3.3 rbind行合并

總結:按行合并,需要注意資料集需要有相同的列字段名

> #生成測試資料student1> ID :4)> score > student1 #生成測試資料student2> ID > score > student2#按行合并,需要注意資料集需要有相同的列字段名> rbind(student1,student2)ID score1  1     82  2    223  3     74  4    335  A    116  B     27  C    558  D     3
           

3.4 merge

#merge文法結構merge(x, y, by = intersect(names(x), names(y)),      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,      sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,      incomparables = NULL, ...)#其中,通過by字段控制連接配接字段by = "ID"為單字段連接配接,by = c("ID","NAME",……)為多字段連接配接;#通過all=FALSE/TRUE、all.x = TRUE和all.y = TRUE實作内連接配接、外連接配接、左連接配接和右連接配接
           
#———merge用法———#> #生成測試資料> ID1 > ID2 > name> score> student1> student2> > #内連接配接:保留交叉位置資料> merge(student1,student2,by.x = "ID1", by.y = "ID2",all=TRUE)  ID1 name score1   1    A    NA2   2    B     83   3    C    224   4    D     75   5 6> #左連接配接:保留左邊所有資料及交叉y資料> merge(student1,student2,by.x = "ID1", by.y = "ID2",all.x=TRUE)  ID1 name score1   1    A    NA2   2    B     83   3    C    224   4    D     7> #右連接配接:保留右邊所有資料及交叉x資料> merge(student1,student2,by.x = "ID1", by.y = "ID2",all.y=TRUE)  ID1 name score1   2    B     82   3    C    223   4    D     74   5      6
           

3.5 補充:集合操作集合操作,是對2個向量的操作,處理2個向量之間的數值的關系,找到包含關系、取交集、并集、差集等。、

# 定義2個向量x,y> x3:[1]  3  4  5  6  7  8 NA> y6:[1] NA  6  7  8  9 10 NA# 判斷x與y重複的元素的位置> is.element(x, y)[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE# 判斷y與x重複的元素的位置> is.element(y, x)[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE# 取并集> union(x, y)[1]  3  4  5  6  7  8 NA  9 10# 取交集> intersect(x, y)[1]  6  7  8 NA# 取x有,y沒有元素> setdiff(x, y)[1] 3 4 5# 取y有,x沒有元素> setdiff(y, x)[1]  9 10# 判斷2個向量是否相等> setequal(x, y)[1] FALSE
           

資料連接配接主要涉及到merge函數和dplyr包中的*_join等函數,

另外sqldf函數(SQL)亦可以實作資料連接配接功能。

參考→《R語言 資料(集)合并與連接配接/比對 | 專題2》

4.過濾/篩選

過濾,是對資料集按照某種規則進行篩選,去掉不符合條件的資料,保留符合條件的資料。對于NA值的操作,主要都集中在了過濾操作和填充操作中,是以就不在單獨介紹NA值的處理了。 可參考↓↓ R語言 | 第一部分:資料預處理     7.資料篩選和8.抽樣 R語言資料管理與dplyr、tidyr | 第4講     5 dplyr中5.1篩選filter和5.3選擇select R 語言 邏輯運算:TRUE/FALSE | 專題3 4.1 缺失值處理

# 生成資料框> df+     b=c('B','A','B','B',NA),+     c=c(rnorm(2),NA,NA,NA));df   a    b          c1  1    B -0.30418392 NA    A  0.37001883 NA    B         NA4  2    B         NA5 NA          NA# 過濾有NA行的資料> na.omit(df)  a b          c1 1 B -0.3041839# 過濾,保留b列值為B的資料> df[which(df$b=='B'),]   a b          c1  1 B -0.30418393 NA B         NA4  2 B         NA
           

4.2 資料增減

常見如以下不同方法

#方法一:減行數或列數x=x[,-1] #代表删除x資料集中第一列資料#方法二:dplyr::mutate#數值重定義和指派#将Ozone列取負數指派給new,然後Temp列重新計算為(Temp - 32) / 1.8mutate(airquality, new = -Ozone, Temp = (Temp - 32) / 1.8)#方法三:subset篩選變量服從某值的子集subset(airquality, Temp > 80, select = c(Ozone, Temp))
           

4.3 數值分段數值分段,就是把一個連續型的數值型資料,按區間分割為因子類型的離散型資料。

> x [1]  1  2  3  4  5  6  7  8  9 10# 把向量轉換為3段因子,分别列出每個值對應因子> cut(x, 3) [1] (0.991,4] (0.991,4] (0.991,4] (0.991,4] (4,7]     (4,7]     (4,7]     (7,10]    (7,10]    (7,10]Levels: (0.991,4] (4,7] (7,10]# 對因子保留2位精度,并支援排序> cut(x, 3, dig.lab = 2, ordered = TRUE) [1] (0.99,4] (0.99,4] (0.99,4] (0.99,4] (4,7]    (4,7]    (4,7]    (7,10]   (7,10]   (7,10]Levels: (0.99,4] < (4,7] < (7,10]
           

5 分組操作

此處僅講述aggregate資料分組計算内容,更多分組計算内容

參考→《R語言 分組計算,不止group_by》

  • dplyr包中的group_by聯合summarize
  • group_by和summarise單變量分組計算
  • group_by和summarise多變量分組計算
  • ddply分組計算示例

5.1 aggregate文法

aggregate(x, by, FUN)#x為資料集#by為分組變量清單#FUN為計算函數
           

5.2 aggregate分組計算

> row_names > col_names > df_matrix > df_matrix  A  B  CA 1 10 19B 2 11 20C 3 12 21A 4 13 22B 5 14 23C 6 15 24A 7 16 25B 8 17 26C 9 18 27#注意分組變量為清單形式> aggregate(df_matrix,list(Group = row_names), mean)  Group A  B  C1     A 4 13 222     B 5 14 233     C 6 15 24
           

5.3 aggregate分組計算補充(formula形式)

可以重點了解一下

aggregate(formula, data, FUN)#Formulas, one ~ one, one ~ many, many ~ one, and many ~ many:#一組對一計算變量函數型分組計算:計算變量~分組變量> aggregate(weight ~ feed, data = chickwts, mean)       feed   weight1    casein 323.58332 horsebean 160.20003   linseed 218.75004  meatmeal 276.90915   soybean 246.42866 sunflower 328.9167#多組對一函數型分組計算:計算變量~分組變量1+分組變量2……> aggregate(breaks ~ wool + tension, data = warpbreaks, mean)  wool tension   breaks1    A       L 44.555562    B       L 28.222223    A       M 24.000004    B       M 28.777785    A       H 24.555566    B       H 18.77778#一組對多計算變量,函數型分組計算:cbind(計算變量1,計算變量2)~分組變量1> aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, mean)  Month    Ozone     Temp1     5 23.61538 66.730772     6 29.44444 78.222223     7 59.11538 83.884624     8 59.96154 83.961545     9 31.44828 76.89655#多組對多計算變量,函數型分組計算:cbind(計算變量1,計算變量2)~分組變量1+分組變量2……> aggregate(cbind(ncases, ncontrols) ~ alcgp + tobgp, data = esoph, sum)       alcgp    tobgp ncases ncontrols1  0-39g/day 0-9g/day      9       2612      40-79 0-9g/day     34       1793     80-119 0-9g/day     19        614       120+ 0-9g/day     16        245  0-39g/day    10-19     10        846      40-79    10-19     17        857     80-119    10-19     19        498       120+    10-19     12        189  0-39g/day    20-29      5        4210     40-79    20-29     15        6211    80-119    20-29      6        1612      120+    20-29      7        1213 0-39g/day      30+      5        2814     40-79      30+      9        2915    80-119      30+      7        1216      120+      30+     10        13
           

6. 排序

#order預設升序,變量前加“-”代表降序 #排序的操作,大多都是基于索引來完成的 #用order()函數來生成索引,再比對的資料的數值上面。 可參考↓↓ R語言 排序&去重操作 | 專題1 R語言 | 第一部分:資料預處理

> row_names > col_names > set.seed(1234)> df_matrix            A      B      C [1,] -1.207 -0.890 -0.837 [2,]  0.277 -0.477  2.416 [3,]  1.084 -0.998  0.134 [4,] -2.346 -0.776 -0.491 [5,]  0.429  0.064 -0.441 [6,]  0.506  0.959  0.460 [7,] -0.575 -0.110 -0.694 [8,] -0.547 -0.511 -1.448 [9,] -0.564 -0.911  0.575> df_frame   group      A      B      C1     A -1.207 -0.890 -0.8372     B  0.277 -0.477  2.4163     C  1.084 -0.998  0.1344     A -2.346 -0.776 -0.4915     B  0.429  0.064 -0.4416     C  0.506  0.959  0.4607     A -0.575 -0.110 -0.6948     B -0.547 -0.511 -1.4489     C -0.564 -0.911  0.575> > #order,其中預設升序,變量前加“-”代表降序> #排序的操作,大多都是基于索引來完成的> #用order()函數來生成索引,再比對的資料的數值上面。> df_frame[order(df_frame$A),]  group      A      B      C4     A -2.346 -0.776 -0.4911     A -1.207 -0.890 -0.8377     A -0.575 -0.110 -0.6949     C -0.564 -0.911  0.5758     B -0.547 -0.511 -1.4482     B  0.277 -0.477  2.4165     B  0.429  0.064 -0.4416     C  0.506  0.959  0.4603     C  1.084 -0.998  0.134> df_frame[order(df_frame$group,-df_frame$A),]  group      A      B      C7     A -0.575 -0.110 -0.6941     A -1.207 -0.890 -0.8374     A -2.346 -0.776 -0.4915     B  0.429  0.064 -0.4412     B  0.277 -0.477  2.4168     B -0.547 -0.511 -1.4483     C  1.084 -0.998  0.1346     C  0.506  0.959  0.4609     C -0.564 -0.911  0.575
           

7. 計數

計數,是統計同一個值出現的次數。

# 生成20個随機數的向量set.seed(1234)xround(rnorm(# 統計每個值出現的次數table(x)hist(x,xlim = c(-10,13),breaks=5)
           
covariance matrix r語言_快速掌握R語言中類SQL資料庫操作技巧

8 資料分裂

分裂計算,是把一個向量按照一列規則,拆分成多個向量的操作。有時候分裂split也被用于分組計算中。

> row_names > col_names > df_matrix > row_names > col_names > df_matrix       A  B  C [1,] 1 10 19 [2,] 2 11 20 [3,] 3 12 21 [4,] 4 13 22 [5,] 5 14 23 [6,] 6 15 24 [7,] 7 16 25 [8,] 8 17 26 [9,] 9 18 27> df_frame   group A  B  C1     A 1 10 192     B 2 11 203     C 3 12 214     A 4 13 225     B 5 14 236     C 6 15 247     A 7 16 258     B 8 17 269     C 9 18 27> df_split $A  group A  B  C1     A 1 10 194     A 4 13 227     A 7 16 25$B  group A  B  C2     B 2 11 205     B 5 14 238     B 8 17 26$C  group A  B  C3     C 3 12 216     C 6 15 249     C 9 18 27
           

另外,可以用因子類型來控制分裂。分成2步操作,第一步先分成與資料集同樣長度的因子,第二步進行分裂,可以把一個大的向量拆分成多個小的向量。

> # 生成因子規則> n > fat  [1] 3 3 1 1 0 1 2 1 3 3 1 1 2 2 2Levels: 0 1 2 3> # 生成資料向量> x  [1] -1.2107366 -1.3102467 -0.4083354 -0.5629753  1.2139442  1.6288760 -0.3160227 -1.8076242 -0.6125961[10] -2.1066644  1.2053009  1.3294407 -0.6836288 -1.7868047  0.1364916> # 對向量以因子的規則進行拆分> split(x, fat)$`0`[1] 1.213944$`1`[1] -0.4083354 -0.5629753  1.6288760 -1.8076242  1.2053009  1.3294407$`2`[1] -0.3160227 -0.6836288 -1.7868047  0.1364916$`3`[1] -1.2107366 -1.3102467 -0.6125961 -2.1066644
           

9. 去重與找重

去重,是把向量中重複的元素過濾掉。找重,是把向量中重複的元素找出來。可參考↓↓R語言 | 第一部分:資料預處理R語言 排序&去重操作 | 專題1R 語言 邏輯運算:TRUE/FALSE | 專題3

> x3:[1] 3 4 5 6 5 6 7 8# 去掉重複元素> unique(x)[1] 3 4 5 6 7 8# 找到重複元素,索引位置> duplicated(x)[1] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE# 找到重複元素> x[duplicated(x)][1] 5 6
           

10.轉置

轉置是一個數學名詞,把行和列進行互換,一般用于對矩陣的操作。

# 建立一個3行5列的矩陣> m1:     [,1] [,2] [,3] [,4] [,5][1,]    1    4    7   10   13[2,]    2    5    8   11   14[3,]    3    6    9   12   15# 轉置後,變成5行3列的矩陣> t(m)     [,1] [,2] [,3][1,]    1    2    3[2,]    4    5    6[3,]    7    8    9[4,]   10   11   12[5,]   13   14   15