文本數據“百詞斬”:stringr 包簡介

定量羣學呂小康2017-11-24 04:11:51

戳上面的藍字關注我們哦,開始你的學術之旅!

文本數據“百詞斬”:stringr 包簡介

stringr 包是Hadley開發的一個高效文本數據處理包。其函數命名延續其一如既往的 tidyverse 風格,非常適合新手學習和使用。以下就其中的基礎函數進行介紹和示例。為更好地説明中文文本的處理,這裏使用了中文向量進行演示。

 

絕大多數 stringr 包中的函數都以str_開頭(表示string),下劃線後跟着一個動詞或其縮寫,以指明其功能。以下按字母序列出 stringr 包中的重要函數及其功能。


函數名稱

功能

str_c()

拼接多個字符串為單個字符串

str_conv()

更改字符串的編碼類型

str_count()

計算字符串中指定模式的字符個數

str_detect()

判斷字符串是否

str_dup()

將向量中的各字符串重複自身 n

str_extract()

提取字符串中包含的指定模式(匹配一次)

str_extract_all()

提取字符串中包含的指定模式(匹配所有)

str_length()

計算字符串的長度(即所包含的字符個數)

str_locate()

給出指定模式在字符串中的起始位置(輸出矩陣)

str_locate_all()

給出指定模式在字符串中的起始位置(輸出列表)

str_match()

判斷字符串中是否包含指定模式(輸出矩陣)

str_match_all()

判斷字符串中是否包含指定模式(輸出列表)

str_order()

給出字符串在所處向量中的位置(默認首字母升序)

str_pad()

用指定字符填充字符串至指定字符長度

str_replace()

替換字符串中的指定模式(匹配一次)

str_replace_all()

替換字符串中的指定模式(匹配所有)

str_replace_na()

將表示缺失值的 NA 替換為字符串 "NA"

str_sort()

按字符串在所處向量中的位置排序(默認首字母升序)

str_split()

根據指定模式切割字符串(輸出列表)

str_split_fixed()

根據指定模式切割字符串(輸出矩陣)

str_sub()

指定起始位置截取子字符串

str_subset()

給出所有包含指定模式的字符串

str_trim()

刪去字符串首尾處的空白符

str_trunc()

刪除部分內容使字符串截為指定寬度

str_which()

給出所有包含指定模式的字符串的位置(輸出整數)

str_wrap()

設定字符串的段落輸出形式

str_view()

網頁格式下對指定模式陰影顯示(匹配一次)

str_view_all()

網頁格式下對指定模式陰影顯示(匹配所有)

str_to_upper()

將字符串中的所有英文字母轉為大寫(upper   case

str_to_lower()

將字符串中的所有英文字母轉為小寫(lower   case

str_to_title()

將字符串中的英文單詞轉為首字母大寫

word()

提取句子中指定位置的單詞


許多函數的功能通過示例可一目瞭然,不再細述。少數複雜的函數會細加解釋。同時請注意 stringr 字符串函數與 R 基礎包中的字符串函數的比較。


展開分析前,請確保已載入 stringr 包。

str_c()

str_c()函數用於橫向拼接字符串。

str_c("南開", "大學")

## [1] "南開大學"

str_c("南開", "大學", sep = "")

## [1] "南開大學"

str_c("南開", "大學", sep = "-")

## [1] "南開-大學"


可見默認不加空格拼接,也可指定用於拼接的字符。但str_c()的功能並不侷限於此。試看下面的命令:

str_c(LETTERS[1:5], letters[1:5], sep = "-")

## [1] "A-a" "B-b" "C-c" "D-d" "E-e"

str_c(LETTERS[1:5], letters[1:5], collapse = "-")

## [1] "Aa-Bb-Cc-Dd-Ee"

str_c(LETTERS[1:5], letters[1:5], sep = "-", collapse = " | ")

## [1] "A-a | B-b | C-c | D-d | E-e"


請結合此例再次明確sepcollapse參數的功能

str_replace_na() 

str_replace_na() 函數將表示缺失值的 NA 替換為字符串 "NA"。試比較以下結果:

na <- c(NA, "A", "B")
na

## [1] NA  "A" "B"

str_replace_na(na)

## [1] "NA" "A"  "B"

str_trunc()

str_trunc(string,
          width,
          side = c("right", "left", "center"),
          ellipsis = "...")

trunc是英文 truncate 的縮寫,其中

 string:待操縱的字符串

 width:截斷後的最大寬度

 side:指定截斷的方向

 ellipis:指明被移除位置的替代符號,默認 ...(寬度為3

x <- c("", "清華大學心理學系", "南開大學社會心理學系")

str_trunc(x, 4, side = "left")

## [1] "..." "..." "..."

str_trunc(x, 2, side = "right", ellipsis = "-")

## [1] "-" "-" "-"

str_trunc(x, 6, side = "center", ellipsis = "XX")

## [1] "北京XX學系" "清華XX學系" "南開XX學系"

str_dup()

str_dup()函數用於複製向量中的字符串,dup 是英文 duplicate 的縮寫。請觀察以下示例。

n <- "南開"
k <- "大學"
nk1 <- c(n, k)

nk1

## [1] "南開" "大學"

nk2 <- str_c(n, k)
nk2

## [1] "南開大學"

str_dup(nk1, 2)

## [1] "南開南開" "大學大學"

str_dup(nk2, 2)

## [1] "南開大學南開大學"

word()

word()函數用於提取句子中指定位置的單詞,一般要求各單詞之間應有空格劃分。這一功能在中文領域目前較難有用武之地,因為中文句子的各個單字之間並無英文單詞之間的空格,除非人為加入。

Chi <- c(" ", " ")
word(Chi, 1, 2)

## [1] " " " "

Eng <- c("He likes cats.", "She hates rats.")
word(Eng, 2)

## [1] "likes" "hates"

str_count()

str_count()用於計算字符串中包含的字符數。

str_count(x)

## [1]  8  8 10

str_count(x, "心理學")

## [1] 0 1 1

str_count()的功能類似於 R 基礎包中的nchar()函數(number of characters),但nchar()的功能更全;前者只能用於計算字符數,後者還可用於計算字節數或寬度。

str_detect()

str_detect(x, "心理學")

## [1] FALSE  TRUE  TRUE

str_extract()

str_extract(x, "心理學")

## [1] NA   "心理學" "心理學"

str_extract_all()

str_extract_all(x, "心理學")

## [[1]]
## character(0)
##
## [[2]]
## [1] "心理學"
##
## [[3]]
## [1] "心理學"

str_extract_all(x, "心理學", simplify = TRUE)

## [,1]   
## [1,] ""     
## [2,] "心理學"
## [3,] "心理學"

str_locate()

str_locate(x, "心理學")

##  start end
## [1,] NA  NA
## [2,] 5   7
## [3,] 7   9

str_locate_all()

str_locate_all(x, "心理學")

## [[1]]
## start end

##
## [[2]]
## start end
## [1,] 5   7
##
## [[3]]
## start end
## [1,]7   9

str_replace()

str_replace(x, "", "xue")

## [1] "北京大xue社會學系" "清華大xue心理學系" "南開大xue社會心理學系"

str_replace_all()

str_replace_all(x, "", "xue")

## [1] "北京大xue社會xue" "清華大xue心理xue"   
## [3] "南開大xue社會心理xue"

str_match()

str_match(x, "心理學")

## [,1]   
## [1,] NA     
## [2,] "心理學"
## [3,] "心理學"

str_match_all()

str_match_all(x, "心理學")

## [[1]]
## [,1]
##
## [[2]]
## [,1]   
## [1,] "心理學"
##
## [[3]]
## [,1]   
## [1,] "心理學"

str_split()

str_split(x, "大學", n = 2)

## [[1]]
## [1] "北京" "社會學系"
##
## [[2]]
## [1] "清華" "心理學系"
##
## [[3]]
## [1] "南開" "社會心理學系"

str_split(x, "大學", n = 2, simplify = TRUE)

## [,1]   [,2]         
## [1,] "北京" "社會學系"   
## [2,] "清華" "心理學系"   
## [3,] "南開" "社會心理學系"

str_split_fixed()

str_split_fixed(x, "大學", n = 2)

## [,1]   [,2]         
## [1,] "北京" "社會學系"   
## [2,] "清華" "心理學系"   
## [3,] "南開" "社會心理學系"

str_sub()

str_sub(x, start = 1, end = 4)

## [1] "北京大學" "清華大學" "南開大學"

str_sub(x, -4, -1)

## [1] "社會學系" "心理學系" "心理學系"

str_subset(x, "心理學")

## [1] "清華大學心理學系"     "南開大學社會心理學系"

str_which()

str_which(x, "心理")

## [1] 2 3

str_view(x, "")

str_view_all(x, "")

str_pad()

str_pad()函數用於填充字符串,格式如下:

str_pad(string,
        width,
        side = c("left", "right", "both"),
        pad = " ")

其中,

 string:待填充的字符串

 width:待填充的最大寬度,長度以字節(byte)計

 side:填充方向

 pad:用於填充的符號(限1個字節寬度),默認為空格

str_pad(x, 20, side = "left")

## [1] "    北京大學社會學系" "    清華大學心理學系" "南開大學社會心理學系"

注意左邊出現的空格。一個漢字佔兩個字節,故南開大學社會心理學系正好20字節,無須填充。再看下例。

str_pad(x, 20, side = "right", pad = "X")

## [1] "北京大學社會學系XXXX" "清華大學心理學系XXXX" "南開大學社會心理學系"

str_order()和str_sort()

str_order()str_sort()分別用於給出字符串的序位及根據這一序位排序。

str_order(x)

## [1] 1 3 2

str_sort(x)

## [1] "北京大學社會學系" "南開大學社會心理學系" "清華大學心理學系"

str_sort(x, decreasing = TRUE)

## [1] "清華大學心理學系" "南開大學社會心理學系" "北京大學社會學系"

str_to_upper()、str_to_lower()和

      str_to_title()

str_to_upper()str_to_lower()str_to_title()用於英語字母的大小寫轉換。

Eng <- c("He likes cats.", "She hates rats.")
str_to_lower(Eng)

## [1] "he likes cats."  "she hates rats."

str_to_upper(Eng)

## [1] "HE LIKES CATS."  "SHE HATES RATS."

str_to_title(Eng)

## [1] "He Likes Cats."  "She Hates Rats."

str_wrap()

paragraph <- c("R是一個免費、自由且跨平台通用的統計計算與繪圖軟件,它有WindowsMacLinux等版本,均可免費下載使用。R項目(The R Project for Statistical Computing)最早由新西蘭奧克蘭大學(Auckland University)的Robert Gentleman1959- Ross Ihaka1954- 開發,故軟件取兩人名字的首字母命名為R")


str_wrap(paragraph, width = 30, indent = 4)

## [1] "R是一個免費、自由且跨平台通\n用的統計計算與繪圖軟件,它有\nWindowsMacLinux等版本,\n均可免費下載使用。R項目(The\nR Project for Statistical\nComputing)最早由新西蘭奧克蘭\n大學(Auckland University)的\nRobert Gentleman1959- \nRoss Ihaka1954- 開發,故軟\n件取兩人名字的首字母命名為R"


此時可見每40個字節即被切分為一行(增加了換行符\n),但並未分行顯示;indent = 4表示首先縮進4字節。在str_wap()的基礎上使用基礎命令cat()即可達到合併成段落。


cat(str_wrap(paragraph, width = 40, indent = 4))

## R是一個免費、自由且跨平台通用的統計計
## 算與繪圖軟件,它有WindowsMacLinux
## 等版本,均可免費下載使用。R項目(The R
## Project for Statistical Computing)最早由
## 新西蘭奧克蘭大學(Auckland University
## Robert Gentleman1959- Ross
## Ihaka1954- 開發,故軟件取兩人名字的
## 首字母命名為R

 

stringr 包中的函數先簡單介紹至此。要更多瞭解文本數據分析的內容,更重要的是應當在此基礎上了解正則表達式(Regular Expressions)的基礎內容,並結合上述函數展開字符串的匹配、提取、替換等操縱。限於篇幅,這裏暫不展開,有興趣者可參考最新公開的stringr速查表(cheatsheet),下載地址如下(點擊閲讀原文可直接跳轉):


https://www.rstudio.com/resources/cheatsheets/

 

此網頁中關於Regular Expressions的兩個速查表,建議大家下載保存。從格式到內容,幾乎可打滿分(此處奉上一張跪拜臉,圖形請自動腦補)。

編輯:江祥雪  潘雨 

· · · · · ·

閲讀原文

TAGS: