R語言-stringr-字符串處理

2021-01-14 宇飛的世界


前言

實際工作中,經常需要處理字符串。R包stringr處理字符相對簡單,尤其是我常用Power BI,但是對M語言不熟悉,不會處理字符數據,往往我就先利用R清洗字符數據列。

本文記錄工作中常用的字符處理函數,部分案例照搬R for Data Science的字符部分。



Excle中自帶的字符函數如: left,len,mid,find,Proper,rept,trim,upper,substitute,concatenate,以及Excle2019新出的concat,textjoin等函數,我個人比較喜歡textjoin 函數,尤其在必須手工寫一段長向量時


學習的時候可以先用stringr包實現以上相對應功能。

資料:


基礎用法

字符串處理的難點,個人覺得在於【正則表達式】的掌握程度,但是需要用到正則表達式時都是比較複雜的字符處理工作,在實際商業文本數據中

運用較多。對大部分常規商業數據分析工作者的面對的表格數據而言,字符處理可能僅僅只是合併、剔除、刪除空格、倒敘等基礎操作。


單雙引號

R語言中字符串輸入時,可以使用單引號,也可以使用雙引號。


轉義

要在字符串中包含單引號或雙引號,可以使用\ 轉義它,即遇到特殊符號時需要轉義。

#install.packages('stringr')
library(stringr)
char <- "我是一名\'小學生\'"   #字符串建議用雙引號包裹,單引號也可以
char

列印會顯示轉義符。要查看字符串的原始內容,可使用writeLines()或cat()

x <- c("\"", "\\")
x
#> [1] "\"" "\\"
writeLines(x)
cat(char)
#> "
#> \

在正則表達式中\ 有特殊含義,有時需要兩個\ ,多體會下面這段,代碼實現移除"||"的功能。

str_remove(string = 'a||b',pattern = "\\|\\|")

另外常見的\n, \t需要被轉義處理,在字符清洗,如小說語義分析,網頁爬蟲後整理等數據清洗過程中經常用到.


字符串長度
char <- "我是R語言學習者"
str_length(char)
# 向量化
str_length(c("a", "R for data science", NA))


連接字符串

R中字符串不像python中可以用加號連接字符串,如下所示:

R 版本

#base R
paste0('a','b')

#stringr
str_c("a","b")
str_c("a", "b", sep = ", ") #sep 參數控制分隔符

Python 版本

'a' + 'b'

多個字符串合併為一個字符,stringr中的函數都是向量化的,合併一個和多個字符都是同樣道理。

#base R
paste0(c('a','b','d','e'),collapse = ',')
#stringr
str_c(c('a','b','d','e'),collapse = ',')  #collapse 參數控制


實際運用案例

library(data.table)
dt <- data.table(col=rep('a',10),letters=letters[1:10])
dt[,newcol:=str_c(letters,collapse = '|'),by=.(col)][]

# 可以多體會體會 有時候有奇用
#工作中路徑需要拆解 類似商品品類路徑 進口水果-熱帶水果-生鮮,用戶行為路徑等
dt <- data.table(col='a',letters=str_c(letters[1:10],collapse = '|'))

my_str_split <- function(x){
 
 str_split(x,pattern = "\\|") %>% unlist()  #str_split 拆解出來是列表 需要向量化
}

dt[,list(newcol=my_str_split(letters)),by=.(col)]


R4.0後新特性

新特性

char <- r"(\\a\ab\d\e\f)" #windows下路徑好用,不用轉義路徑複製和直接可用
char

char <- r"(我是一名'R語言'學習者)"
cat(char)



常用函數截取字符串,匹配字符串,添加指定字符籌齊長度,去除左右兩邊空格,分割字符串,大小寫轉換等常用函數。
截取

與Excle中left,mid,right函數功能類似

str_sub() 函數 三個參數:

string:需要被截取的字符串

start: 默認1L,即從最開始截取

end:默認-1L,即截取到最後

#注意end 3 和 -3的區別
str_sub(string = '我是R語言學習者',start = 2,end = 3)
str_sub(string = '我是R語言學習者',start = 2,end = -3)


匹配

查看函數幫助文檔,str_match()按照指定pattern(正則表達式)查找字符.重點困難點正則表達式的編寫.

?str_match()
?str_match_all()
?str_extract()
?str_extract_all()

str_extract()函數返回向量,str_match()函數返回矩陣.

#原文來源烽火戲諸侯的<劍來>
strings <- c('陳平安放下新折的那根桃枝,吹滅蠟燭,走出屋子後,坐在臺階上,仰頭望去,星空璀璨.')
str_extract(strings,'陳平安')
str_match(strings,'陳平安')

匹配中文的正則表達式[\u4e00-\u9fa5]

str_extract_all(strings,'[\u4e00-\u9fa5]') #返回list

查找數字的正則表達式[0-9];查找英文的正則表達式:[a-zA-Z]

strings <- c('00123545','LOL league of legends')
str_extract_all(strings,'[0-9]')
str_extract_all(strings,'[a-zA-Z]')


添加字符

str_pad() 函數向字符串添加字符

像工作中處理月份的時候,1,2,3,4,5,6,7,8,9,10,11,12變成01,02,03,04,05,06,07,08,09,10,11,12.按照日期時間輸出文件名稱,如下所示:

str_pad(string = 1:12,width = 2,side = 'left',pad = '0')


去除空格

與excel中trim函數功能類似,剔除字符中的空格,但是不可以剔除字符中的空格

# side 可選 both  left right
str_trim(' ab af ',side = 'both')


分割字符

str_split()處理後的結果是列表

# 得到列表,需要向量化
str_split("a,b,d,e",pattern = ',')

str_split('ab||cd','\\|\\|') %>% unlist()
# same above
#str_split('ab||cd','\\|\\|') %>% purrr::as_vector()

當待處理的字符串是字符串向量時,得到的列表長度與向量長度一致

fruits <- c(
 "apples and oranges and pears and bananas",
 "pineapples and mangos and guavas"
)

str_split(fruits, " and ")


其他函數

匹配字符串本身行篩選時候能用


fruit <- c("apple", "banana", "pear", "pinapple")
str_subset(fruit, "a")
str_which(fruit, "a") # 匹配字符首次出現的位置

#str_which 是which(str_detect(x,pattern))的包裝
#str_which()

#str_subset是對x[str_detect(x,pattern)]的包裝
#str_subset()

#篩選出字母行
set.seed(24)
dt <- data.table::data.table(col=sample(c(letters,1:10),100,replace = T))
head(dt[str_which(col,pattern = '[a-z]')])

複製字符串

fruit <- c("apple", "pear", "banana")
str_dup(fruit, 2)
str_dup(fruit, 1:3)
str_c("ba", str_dup("na", 0:5))


從str_detect()包裝得到.

str_starts('abd','a')
str_detect('abd','^a')

str_ends('abd','d')
str_detect('abd','a$')

dog <- "The quick brown dog"
str_to_upper(dog)
str_to_lower(dog)
str_to_title(dog)
str_to_sentence("the quick brown dog")

R實現Excel字符函數

以下函數實現,僅僅只是從stringr包的函數上修改,並且沒有完善,沒有報錯提示等的簡陋版本,如果感興趣的可以嘗試利用Rcpp寫出高性能版本的同功能函數。

r_left <- function(str,num){
 str_sub(string = str,start = 1,end = num)
}
r_left('我是R語言學習者',3)

r_right <- function(str,num){
 str_sub(string = str,start = str_length(str) - num + 1)
}
r_right('我是R語言學習者',3)

r_mid <- function(str,start,num){
 str_sub(string = str,start = start,end = start + num -1)
}
r_mid('我是R語言學習者',3,3)

其餘函數可以自行實現,歡迎留言留下實現的好用的字符處功能函數。


相關焦點

  • 快速上手系列-C語言之字符串處理函數(一)
    C語言中常用的字符串操作函數,有比如計算字符串長度、字符串拷貝,字符串比較等這樣的整體操作函數,有字符串查詢函數,也有字符串轉換函數等等,這裡先介紹字符串整體操作函數。字符串整體操作函數實際編程中,經常遇到對字符串整體的控制等操作,比如長度測量函數strlen(),字符串拷貝函數strcpy()/strncpy(),字符串比較函數 strcmp()/strncmp(),字符串連接函數strcat()/strncat()等,這些函數是非常有用的。
  • 傻傻分不清系列|Python中各種字符串處理方法
    Python易混淆知識系列:Pandas字符串方法和字符串內建函數,使用Python的一個優勢就是字符串處理起來比較容易。Python的初學者在學習字符串內建函數的時候往往會很困惑:字符串的內建函數是對單個字符串對象處理,如果要對成千上萬個字符串對象處理該怎麼辦?
  • Python中去除字符串首尾空格、特殊字符和指定子字符串的方法
    第七十七節:去除字符串中的空格和特殊字符字符串在實際應用中,有很多情況是默認去除字符串首尾的空格狀態,去除幾個比較特殊的字符的。這幾個特殊的字符是:換行符「\n」、回車符「\r」、制表符「\t」。;使用print()函數輸出字符串時,其中的特殊字符「\n、\r、\t」則被默認為命令執行了;使用strip()方法,只能去除字符串首尾的空格和特殊字符,存在於字符串中間的空格和特殊字符是無法去除的。
  • Go語言的學習筆記(第二章)
    Go 語言裡的字符串的內部實現使用UTF-8編碼。字符串轉義符Go 語言的字符串常見轉義符包含回車、換行、單雙引號、制表符等,如下表所示:轉義符含義\r回車符(返回行首)\n換行符(直接跳到下一行的同列位置)\t制表符\'單引號\"雙引號
  • R語言data manipulation學習筆記之subset data
    taoyan:R語言中文社區特約作家,偽碼農,R語言愛好者,愛開源。
  • 為什麼Java字符串是不可變對象?(3)
    15:04 答案三:String類不可變性的好處String是所有語言中最常用的一個類
  • r語言實戰第一章示例實踐解答_python代碼示例 - CSDN
    sed的常用功能包含對文件實現快速增刪改查(增加、刪除、修改、查詢),其中查詢的功能中最常用的兩大功能是過濾(過濾指定字符串)和取行(取出指定的行)。 正則表達式的匹配技巧:處理所需要的目標(獲取的IP)前的字符串一般以「..」開頭(^.*)來匹配,最後將目標IP前的結尾寫上實際的字符串(這裡的字符串必須要唯一,否則就會貪婪匹配到最後一個相同的字符串),匹配的正則和實際要處理的第二行其匹配關係如圖11-3所示。
  • R語言之plot繪圖函數的使用
    plot函數的語法格式R語言中plot()函數的基本格式如下:plot(x,y,...)plot函數中,x和y分別表示所繪圖形的橫坐標和縱坐標;函數中的...為附加的參數。主要參數的含義如下:(1)type為一個字符的字符串,用於給定繪圖的類型,可選的值如下:"p":繪點(默認值);"l":繪製線;"b":同時繪製點和線;"c":僅繪製參數
  • 掌握R語言for循環一文就夠了(認真臉)
    嗨,大家好,我就是帥氣的小編~R語言是進行統計分析和可視化的優秀語言(其實機器學習和網頁製作也可以用R,小聲說~|ω`))R語言相信大家在利用R語言進行數據分析的時候可能會有大數據分析需求。那麼大數據如此的多,批處理的需求就比較大了。R語言不考慮並行運算下的簡單批處理實現方式就是for循環。
  • r語言有什麼優劣勢及R語言的未來發展趨勢_R語言在現實中的應用
    r語言有什麼優劣勢分析 R語言擁有強大的軟體包生態系統與圖表優勢「當R語言剛剛誕生之時,它最大的優勢就是以自由軟體的姿態出現。其原始碼以及所有一切都可供我們直接查看。」 Adams也表示,R語言在圖形及圖表方面的一切能夠都是「無與倫比」的。其dplyr與ggplot2軟體包分別用於進行數據處理與繪圖,且「能夠非常直觀地提升我的生活質量,」他感嘆道。 在機器學習方面,R語言的優勢則體現在與學術界的強大聯動效應,Adams指出。
  • R語言可視化之UpSetR包
    utils datasets methods base#### other attached packages:## [1] UpSetR_1.3.3#### loaded via a namespace (and not attached):## [1] Rcpp_0.12.13 knitr_1.17 magrittr_1.5 munsell_0.4.3## [5] colorspace_1.3-2 rlang
  • 跟著Nature學畫圖~使用R語言的ggtree給進化樹添加圖片注釋
    人類的近親肺魚基因組被解析,點進去看到裡面有一張進化樹的圖image.png正好自己最近在學習R語言的ggtree,之前也在ggtree的幫助文檔看到過類似的圖片,所以決定重複一下這張圖論文是Giant lungfish genome elucidates the conquest of land
  • C語言|文件指針、fopen()、fscanf()、fclose()
    參數0表示程序正常結束,非0參數通常表示不正常的程序結束C語言允許同時打開多個文件,不同文件採用不同文件指針指示,但不允許同一個文件在關閉前被再次打開如圖所示,fgets()函數用來從文本文件中讀取字符串,調用格式為:fgets(s,n,fp);其中s可以是字符數組名或字符指針(指向字符串的指針),用該函數接收的字符串就放在s裡面n是指定讀入的字符個數
  • r語言work_r語言work函數 - CSDN
    R is freeR是用於統計分析、繪圖的語言和操作環境。R是屬於GNU系統的一個自由、免費、原始碼開放的軟體,它是一個用於統計計算和統計製圖的優秀工具。R是一套完整的數據處理、計算和製圖軟體系統。(6) R語言是徹底面向對象的統計程式語言。(7) R語言和其它程式語言、資料庫之間有很好的接口。(8) R語言是自由軟體,可以放心大膽地使用,但其功能卻不比任何其它同類軟體差。(9) R語言具有豐富的網上資源一 入門訓練1.
  • R數據分析:創建向量的方法
    在R語言中,向量(Vector)是相同基本類型元素組成的序列,相當於一維數組。向量的元素可以是數值型、字符型、邏輯值型和複數型,對應分別稱為數值型向量、字符串型向量、邏輯型向量和複數型向量。向量中可以包含一個元素,也可以包含多個元素。同一個向量中的數據類型應該相同。
  • 自然語言處理系列之人機之間的巴別塔之謎【一】
    本文從「人機互動的本質」入手,重點解析自然語言處理中的難點及潛在機會,竹間智能自然語言系列專欄文章第一篇,雷鋒網(公眾號:雷鋒網)已獲授權。在AlphaGo令所有圍棋大師俯首稱臣的今天,深度學習是否也能夠在語言領域展現同樣的能力?在該系列文章裡,竹間智能NLP及語言學專家組,將帶大家回顧人類對語言認識的不斷演進,討論自然語言處理的重難點、最新的進展,以及未來發展的方向。也許在不久的將來,人類語言本身也會隨著AI的進步而進步吧!
  • R語言中使用scan函數讀取文件中的數據
    要讀取的文本文件中的數據可以使用下面的語句從該文件中讀取出數據:(1)scan("student.txt", what="c") #以字符串的格式讀取數據scan函數讀取文本文件中的數據從結果來看,可能並非我們所要的形式,上面這三種形式可以用於整個文件只有一種數據的情形,如只有100個人的身高數據,而對於有多個變量的數據,可能就不適用了,如第一種格式,它將欄位名也當做數據來讀取了,其它兩種格式,將所有變量(欄位)中的數據混到一起了,在處理時不夠方便
  • 9 本優秀的 R 語言免費電子圖書
    R語言是主要用於統計分析、繪圖的語言和操作環境。 R本來是由來自紐西蘭奧克蘭大學的Ross Ihaka和Robert Gentleman 開發。
  • Python文檔字符串生成器:基於CodeBERT,支持Google、Numpy等多種...
    木易 發自 凹非寺量子位 報導 | 公眾號 QbitAI又一款懶人神器問世了:Visual Studio Code的擴展,基於CodeBERT的Python文檔字符串生成器。
  • R語言:t檢驗
    BioNews,專注於報導生命科學領域相關新聞,長按下方二維碼即可關注"BioNews"(id : iBioNews)1. t分布(不同自由度)了解r語言幾個函數配對樣本t檢驗(paired/matched t-test)教材光碟數據:例03-06.sav前提條件:配對設計(同質對子接受兩種不同處理;同一樣品接受不同處理;同一對象接受處理前後)# install.packages("memisc")library(memisc)paired_df <- data.frame(as.data.set( spss.system.file