R語言數據處理常用函數

一.向量相關函數

  1. is.na-判斷空值
    關鍵詞:空值
is.na(x)
    x:向量
> test =c('Hello', 'World',NA, 1,  2, 3) 
> is.na(test)
[1] FALSE FALSE  TRUE FALSE FALSE FALSE
> 
> test[! is.na(test)] #去除test中NA值
[1] "Hello" "World" "1"     "2"     "3" 
  1. union-計算並集
    關鍵詞: 並集
union(x,y)
    x, y:向量
> union(1:4,2:5)
[1] 1 2 3 4 5
> union(1:4,8:10)
[1]  1  2  3  4  8  9 10

Tips:union只可以處理倆個向量,那如何計算多個向量的並集呢?

> union(1:4,union(2:5,8:10))
[1]  1  2  3  4  5  8  9 10

這個例子是想強調:函數是可以疊加的,不同函數之間也是如此

  1. intersect-計算交集
    關鍵詞: 交集
intersect(x,y)
    x, y:向量
 
> intersect(1:4,2:5)
[1] 2 3 4
> intersect(1:4,8:10)
integer(0) # 表示沒有並集

Tips:先求並集,再求交集

> intersect(1:4,union(2:5,8:10))
[1] 2 3 4
  1. setdiff-獲取左向量的特有元素
    關鍵詞:左向量 特有 唯一
setdiff(x,y)
    x, y:向量
> setdiff(1:4,2:5)
[1] 1
> setdiff(1:4,8:10)
[1] 1 2 3 4
  1. seq-生成數值型向量
    關鍵詞:序列 生成 間隔
seq(from,to,by=,length.out=)
    from:起始數值
    to:終止數值
    by:序列間隔,默認爲1
    length.out:將from-to區間劃分爲多少份,可簡化爲len
> seq(1,9,by=3) # 生成1到9,以3爲間隔的序列
[1] 1 4 7
> seq(1,9,len=4) #將1到9的序列,劃分爲4等份
[1] 1.000000 3.666667 6.333333 9.000000
  1. sample-隨機抽取向量
    關鍵詞:隨機
sample(x,size,replace=FALSE)
    x:待隨機抽取的向量
    size:抽取的次數,默認抽取length(x)次
    replace:是否重複抽樣
> sample(1:10) # 從1:10序列中隨機不放回抽取10次
 [1]  2  9  3  4  7  1  5  6  8 10
> sample(1:10,5) # 從1:10序列中隨機不放回抽取5次
[1] 8 2 6 4 5
> sample(1:10,5,rep=T) # 從1:10序列中隨機放回抽取5次
[1]  2  4  8 10  5
注意:

隨機抽取意味着運行兩次sample(1:10,5)得到的結果不一樣

set.seed()可以重複隨機結果

請自行運行兩次,每次都可以獲得2 7 7 7 9
set.seed(1234)
sample(1:10,5,rep=T)
  1. rep-重複向量
    關鍵詞:重複
rep(x,each,times)
    x:待重複的向量
    each:每一個元素重複的次數
    times:向量整體重複次數
> rep(c(1,  2, 3),2) # 向量整體重複2次
[1] 1 2 3 1 2 3
> rep(c(1,  2, 3),each=2) # 向量的每一個元素依次重複2次
[1] 1 1 2 2 3 3
> rep(c(1,  2, 3),1:3) # 向量的每一個元素重複不同次數
[1] 1 2 2 3 3 3
> rep(c(1,  2, 3),each=2, times=3) #向量每一個元素重複2次,總共重複3次
 [1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
  1. rev-反向排列向量
    關鍵詞:反向 反序 逆序
rev(x)
    x:待反向排列的向量
> rev(1:4)
[1] 4 3 2 1
> rev(c('a','b','c','d'))
[1] "d" "c" "b" "a"
  1. table-頻次統計
    關鍵詞:頻次 統計 計數
table(x)
    x:待統計向量
> table(c(1,2,2,4,7,1,1))
​
1 2 4 7 
3 2 1 1 

二.排序相關函數

  1. sort-元素重排
    關鍵詞:排序 重排
sort(x, decreasing=FALSE)
    x: 待重排向量
    decreasing: 降序排列,默認FALSE
> sort(c(4,2,1,5,8,1,4))
[1] 1 1 2 4 4 5 8
> sort(c(4,2,1,5,8,1,4),decreasing = T)
[1] 8 5 4 4 2 1 1
> sort(c('b','e','a')) # 返回重新排序後的向量
[1] "a" "b" "e"
  1. order-求元素順序
    關鍵詞:排序 順序
order(x, decreasing=FALSE)
    x: 待排序向量
    decreasing: 降序排列,默認FALSE
> order(c('b','e','a')) # 返回排序的座標值
[1] 3 1 2
> order(c('b','e','a'),decreasing = T)
[1] 2 1 3
  1. rank-求元素排名
    關鍵詞:排序 排名
rank(x)
    x: 待求排名的向量
> rank(c('b','e','a')) # 返回元素的排名
[1] 2 3 1

三.字符相關函數

  1. tolower-字符串小寫轉換
    關鍵詞:小寫
tolower(x)
    x: 待轉換字符串或字符串向量
> tolower('Hello World')
[1] "hello world"
  1. toupper-字符串大寫轉換
    關鍵詞:大寫
toupper(x)
    x: 待轉換字符串或字符串向量
> toupper('Hello World')
[1] "HELLO WORLD"
  1. sub-字符串替換
    關鍵詞:替換 批量 正則
 
sub(pattern, replacement, x)
    pattern:待替換原始字符串模式
    replacement:待替換目標字符串
    x: 待轉換字符串或字符串向量
> sub("a","A",c("abcda","adcba")) #只替換每次字符串的第1個匹配
[1] "Abcda" "Adcba"
> gsub("a","A",c("abcda","adcba")) #替換所有匹配
[1] "AbcdA" "AdcbA"
> sub('a$', 'A', c("abcda","adcba")) #只替換位於末尾的a
[1] "abcdA" "adcbA"
> sub('b.*a','Box', c("abcda","adcba")) # 替換從b到a的字符
[1] "aBox"   "adcBox"
> sub('b.','Box', c("abcda","adcba"))  # 替換b和其後一位的字符
[1] "aBoxda" "adcBox"
> sub('b.+','Box', c("abcda","adcba")) # 替換從b之後的所有字符
[1] "aBox"   "adcBox"
> sub('l.*l','AAAA','Hello World') #貪婪匹配:匹配儘可能多的字符
[1] "HeAAAAd"
> sub('l.*?l','AAAA','Hello World') #懶惰匹配:匹配最短的字串
[1] "HeAAAAo World"
pattern參數可以結合正則表達式進行通配

正則表達式語法規則:

. 除了換行以外的任意字符 ^ 放在句首,表示一行字符串的起始 $ 放在句尾,表示一行字符串的結束

*零個或者多個之前的字符

+一個或者多個之前的字符 ? 零個或者一個之前的字符
  1. substr-字符串截取
    關鍵詞:截取
substr(x, start, stop)
    x:待截取字符串或字符串向量
    start:起始位置
    stop:終止位置
> substr('Hello World', 1, 4)
[1] "Hell"
  1. strsplit-字符串切割
    關鍵詞:切割
 
strsplit(x, split)
    x:待切割字符串或字符串向量
    split:分隔符
> strsplit("Hello World", ' ') #返回列表形式
[[1]]
[1] "Hello" "World"

Tips: strsplit返回結果形式爲列表,可以通過unlist函數將列表轉化爲向量

> unlist(strsplit('Hello World', ' '))
[1] "Hello" "World"
  1. paste-字符串連接
    關鍵詞:連接
paste(…,sep="",collapse=NULL)
    ...:一個或多個R對象
    sep:元素分隔符
    collapse:字符串分隔符
> paste('Hello','World',sep=', ')
[1] "Hello, World"
> paste('Hello','World',1, 2, 3,sep='_!_ ')
[1] "Hello_!_ World_!_ 1_!_ 2_!_ 3"
> paste(c('Hello','World'),c(1, 2, 3),sep=', ')
[1] "Hello, 1" "World, 2" "Hello, 3"
> paste(c('Hello','World'),c(1, 2, 3),sep=', ',collapse = '; ')
[1] "Hello, 1; World, 2; Hello, 3"

四.匹配相關函數

  1. match-整詞匹配
    關鍵詞:匹配 查詢
match(x,table)
    x:待查詢值
    table:匹配模板
> match(c('Hi', 'Wor', 2, 1, 3),c('Hello', 'World', 1, 2, 3))
[1] NA NA  4  3  5

Tips: match返回值爲table中匹配x值的位置,沒有匹配上返回NA; %in% 類似match,但是返回值爲邏輯值

> c('Hi', 'Wor',  2, 1, 3) %in% c('Hello', 'World', 1, 2, 3)
[1] FALSE FALSE  TRUE  TRUE  TRUE
  1. grep-關鍵字搜索
    關鍵詞:搜索 查詢
grep(pattern, x)
    pattern:待搜索字符串模式
    x: 待搜索字符串或字符串向量
> grep('o',c('Hello', 'World', 1,  2, 3)) # 返回匹配上的位置
[1] 1 2
> grepl('o',c('Hello', 'World', 1,  2, 3)) # 返回邏輯值
[1]  TRUE  TRUE FALSE FALSE FALSE

Tips: match爲整詞匹配,grep爲關鍵字匹配;match第一個參數可以是向量,grep第一個參數只能是字符;match不能使用正則,grep可以使用正則

五.數據框相關函數

  1. na.omit-刪除含有空值的行
    關鍵詞:數據框 空值 行
na.omit(df)
    df:數據框
> head(airquality) # airquality是R內置的示例數據集
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6
> na.omit(head(airquality))
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
  1. apply-數據框循環
    apply相比較for循環,可以提高運算效率
    關鍵詞:數據框 循環
apply(X, MARGIN, FUN...)
    X:數組、矩陣、數據框
    MARGIN:1表示按行,2表示按列
    FUN:調用函數
> head(airquality) # airquality是R內置的示例數據集
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6
> apply(head(airquality), 1, mean)
       1        2        3        4        5        6 
51.90000 40.16667 42.60000 68.91667       NA       NA 
> apply(head(airquality), 2, mean)
   Ozone  Solar.R     Wind     Temp    Month      Day 
      NA       NA 11.45000 66.16667  5.00000  3.50000 
  1. subset-數據框截取
    subset可以根據自定義條件截取數據框子集
    關鍵詞:數據框 截取 子集
subset(x,...,select)
    x: 數據框
    ...: 條件選擇,主要針對行操作
    select: 條件選擇,主要針對列操作
> head(airquality) # airquality是R內置的示例數據集
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6
> head(subset(airquality,Temp > 80, select = c(Ozone,Temp))) #選擇 Temp>80的行,並且只展示Ozone和Temp列
   Ozone Temp
29    45   81
35    NA   84
36    NA   85
38    29   82
39    NA   87
40    71   90
> head(subset(airquality, Day == 1, select = -Temp)) #選擇Day=1的行,並且刪除Temp列
    Ozone Solar.R Wind Month Day
1      41     190  7.4     5   1
32     NA     286  8.6     6   1
62    135     269  4.1     7   1
93     39      83  6.9     8   1
124    96     167  6.9     9   1
  1. split-數據框拆分
    split可以根據某一列(因子型)將數據框拆分爲不同子集
    關鍵詞: 數據框 拆分 子集 因子
split(x, f)
    x: 數據框
    f: 因子型列表
> head(iris) # iris爲R內置
  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
6          5.4         3.9          1.7         0.4  setosa
> class(iris$Species) # Species列爲因子型
[1] "factor"
> levels(iris$Species) # 查看Species的類別
[1] "setosa"     "versicolor" "virginica"
> class(split(iris,iris$Species)) # 拆分後的數據類型爲列表
[1] "list"
> names(split(iris,iris$Species)) # 拆分後的列表名稱
[1] "setosa"     "versicolor" "virginica" 
> head(split(iris,iris$Species)[['versicolor']]) # 查看拆分後的versicolor子集
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
51          7.0         3.2          4.7         1.4 versicolor
52          6.4         3.2          4.5         1.5 versicolor
53          6.9         3.1          4.9         1.5 versicolor
54          5.5         2.3          4.0         1.3 versicolor
55          6.5         2.8          4.6         1.5 versicolor
56          5.7         2.8          4.5         1.3 versicolor
  1. merge-數據框合併
    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)
    x: 數據框
    y: 數據框
    by: 指定合併依據列,默認根據數據框列名自行判斷
    all: 指定輸出方式,默認僅輸出非空行

自定義數據框

> df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)), Taste=c(rep("Sweet", 3), rep("bitter", 3))); df1
  CustomerId Product  Taste
1          1 Toaster  Sweet
2          2 Toaster  Sweet
3          3 Toaster  Sweet
4          4   Radio bitter
5          5   Radio bitter
6          6   Radio bitter
> df2 = data.frame(CustomerId = c(2, 4, 7), State = c(rep("Alabama", 2), rep("Ohio", 1)), Flavour=c(rep("Sweet", 3), rep("bitter", 3))); df2
  CustomerId   State Flavour
1          2 Alabama   Sweet
2          4 Alabama   Sweet
3          7    Ohio   Sweet
4          2 Alabama  bitter
5          4 Alabama  bitter
6          7    Ohio  bitter
> df3 = data.frame(CustomerId = c(1, 4, 7), Product = c("Toaster","Alabama", "Ohio")); df3
  CustomerId Product
1          1 Toaster
2          4 Alabama
3          7    Ohio
> merge(x=df1, y=df2) #默認根據df1、df2相同列CustomerID進行合併
  CustomerId Product  Taste   State Flavour
1          2 Toaster  Sweet Alabama   Sweet
2          2 Toaster  Sweet Alabama  bitter
3          4   Radio bitter Alabama   Sweet
4          4   Radio bitter Alabama  bitter
> merge(x=df1, y=df3) #默認根據df1、df3相同列CustomerID、Product進行合併
  CustomerId Product Taste
1          1 Toaster Sweet
> merge(df1, df3, by="CustomerId") #指定根據df1、df3相同列CustomerID進行合併
  CustomerId Product.x  Taste Product.y
1          1   Toaster  Sweet   Toaster
2          4     Radio bitter   Alabama
> head(merge(df1, df2, by.x="Taste", by.y="Flavour")) #指定根據df1的Taste列、df2的Flavour列進行合併
   Taste CustomerId.x Product CustomerId.y   State
1 bitter            4   Radio            2 Alabama
2 bitter            4   Radio            4 Alabama
3 bitter            4   Radio            7    Ohio
4 bitter            5   Radio            2 Alabama
5 bitter            5   Radio            4 Alabama
6 bitter            5   Radio            7    Ohio
> merge(x=df1, y=df3, by="CustomerId", all=T) #指定根據df1、df3相同列CustomerID進行合併,輸出所有內容
  CustomerId Product.x  Taste Product.y
1          1   Toaster  Sweet   Toaster
2          2   Toaster  Sweet      <NA>
3          3   Toaster  Sweet      <NA>
4          4     Radio bitter   Alabama
5          5     Radio bitter      <NA>
6          6     Radio bitter      <NA>
7          7      <NA>   <NA>      Ohio
> merge(x=df1, y=df3, by="CustomerId", all.x =T) #指定根據df1、df3相同列CustomerID進行合併,輸出df1所有內容
  CustomerId Product.x  Taste Product.y
1          1   Toaster  Sweet   Toaster
2          2   Toaster  Sweet      <NA>
3          3   Toaster  Sweet      <NA>
4          4     Radio bitter   Alabama
5          5     Radio bitter      <NA>
6          6     Radio bitter      <NA>
> merge(x=df1, y=df3, by="CustomerId", all.y = T) #指定根據df1、df3相同列CustomerID進行合併,輸出df3所有內容
  CustomerId Product.x  Taste Product.y
1          1   Toaster  Sweet   Toaster
2          4     Radio bitter   Alabama
3          7      <NA>   <NA>      Ohio

Tips:
is.na也可以判斷數據框空值

> is.na(merge(x=df1, y=df3, by="CustomerId", all.y = T))
     CustomerId Product.x Taste Product.y
[1,]      FALSE     FALSE FALSE     FALSE
[2,]      FALSE     FALSE FALSE     FALSE
[3,]      FALSE      TRUE  TRUE     FALSE

complete.cases可以判斷數據框某一列是否全部爲非空值

> complete.cases(merge(x=df1, y=df3, by="CustomerId", all.y = T))
[1]  TRUE  TRUE FALSE

na.omit可以刪除空行

> na.omit(merge(x=df1, y=df3, by="CustomerId", all.y = T))
  CustomerId Product.x  Taste Product.y
1          1   Toaster  Sweet   Toaster
2          4     Radio bitter   Alabama
發佈了61 篇原創文章 · 獲贊 92 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章