搜尋感興趣的網誌

所有文章連結

2022年3月29日 星期二

R Packages introduce - stringr | R包介紹 - stringr

 



Character字符在數據操作上並不是最主要的處理項目,在分析的類別上幾乎都是以數字、統計為優先處理的,關於字符通常也都轉換成日期、月份、星期等等。

不過字符的使用也並不是毫無用處,畢竟文字總是比數字來的直觀,理解的速度也是比數字來的快(這部分數字好的大大有可能會不認同),有時數字轉換成字符也比好進行統計或彙整(例如id integer轉 character,進行數據集堆疊與統計時才較不會出錯),所以也還是把處理字符的包做個介紹。

所有stringr內的函數開頭是固定的,都是” str_ ”,並且支援正則表達式,很清楚也非常快速理解這個函數是屬於哪個包的,以下為八個較常用到的函數 :

 

` str_detect ()` : TRUE、FALSE是否匹配。

str_detect 文章 >> 請點我

 

`str_count()` : 數量計算。

str_detect 文章 >> 請點我

 

` str_subset ()` : 取出匹配的文字組合。

str_subset  文章 >> 請點我

 

` str_locate ()`: 找出設定文字的位置。

str_locate 文章 >> 請點我

 

` str_extract ()` : 提取出匹配的文本(單一文字)。

 str_extract 文章 >> 請點我


` str_match ()` : 取出部分匹配文字

str_match 文章 >> 請點我

 

` str_replace ()` : 替換文字。

str_replace 文章 >> 請點我

 

` str_split ()` : 文字拆解。

str_split 文章 >> 請點我

 

stringr的函數結構上有一些相同的操作方式 :

1.      第一個參數為數據集

2.      第二個參數為需要修改的字符向量。

3.      支援pipes通道。

2022年3月28日 星期一

R Packages stringr - str_locate | R包stringr - str_locate

 


str_locate用處與str_subset、str_which很像,都是查找位置,有趣的是這幾個函數查找的結果與方式都不相同,str_subset取出符合的字串,str_which輸出符合的字串位置,str_locate則是輸出準確位置


基本語法

str_locate(dataset$string, 查找的字元或字串)

str_locate_all(dataset$string, 查找的字元或字串)


有幾點要注意一下

  • 小寫與大寫判斷為不同字元,需要完全確定大小寫
  • 進行搜尋時" "與"[ ]"定義上與其他函數不同
  • 重複的結果並不會全部返回,除非使用str_locate_all函數


創個數據集先

# 建立數據集
stringr_df <- tibble(
    weekday = c("Sunday", "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday")
    )

# 輸出結果
r$> stringr_df # A tibble: 7 x 1 weekday <chr> 1 Sunday 2 Monday 3 Tuesday 4 Wednesday 5 Thursday 6 Friday 7 Saturday


查找"day",可以看到day在第一個字符串中從4開始6結束

# 查找day
str_locate(stringr_df$weekday, "day")

# 輸出結果
r$> str_locate(str
ingr_df$weekday, "day") start end [1,] 4 6 [2,] 4 6 [3,] 5 7 [4,] 7 9 [5,] 6 8 [6,] 4 6 [7,] 6 8


如果使用模糊查找或是字元的方式呢?結果與其他函數不同,使用[]查找的結果只有進行"d"的搜尋就返回了,字元查找以"e"去搜尋,Wednesday應該是2, 5,但返回的是2, 2,表示搜尋返回的部分若重複的話只有返回第一個搜尋結果

# 用[ ]查找day
str_locate(stringr_df$weekday, "[day]")

# 輸出結果
r$> str_locate(stringr_df$weekday, "[day]") start end [1,] 4 4 [2,] 4 4 [3,] 5 5 [4,] 3 3 [5,] 6 6 [6,] 4 4 [7,] 2 2

# 查找"e"
str_locate(stringr_df$weekday, "e")

# 輸出結果
r$> str_locate(stringr_df$weekday, "e") start end [1,] NA NA [2,] NA NA [3,] 3 3 [4,] 2 2 [5,] NA NA [6,] NA NA [7,] NA NA


使用str_locate_all進行查找,會將重複的進行位置查找後輸出

# 查找"e"
str_locate_all(stringr_df$weekday, "e")

# 輸出結果
r$> str_locate_all(stringr_df$weekday, "e") [[1]] start end [[2]] start end [[3]] start end [1,] 3 3 [[4]] start end [1,] 2 2 [2,] 5 5 [[5]] start end [[6]] start end [[7]] start end

R Packages stringr – str_count | R包 stringr – str_count

 


str_count用來計算出現的頻率,可以檢查單一字元或字串,以下就來進行簡單的操作

 

基本語法

str_count(dataset$string, 檢查的字元或字串)


有幾點要注意一下

  • " "    >> 準確查找,也就是AND,完全符合才行
  • "[ ]" >> 模糊查找,也就是OR,部分符合即可
  • 小寫與大寫判斷為不同字元,需要完全確定大小寫


建立字串數據框用來計算

# 建立數據框
tringr_df <- tibble(
    weekday = c("Sunday", "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday")
    )

# 輸出結果
r$> stringr_df # A tibble: 7 x 1 weekday <chr> 1 Sunday 2 Monday 3 Tuesday 4 Wednesday 5 Thursday 6 Friday 7 Saturday

來計算字元出現的次數

# 檢查"d"在各字串出現的數量
str_count(stringr_df$weekday, "d")

# 輸出結果
r$> str_count(stringr_df$weekday, "d") [1] 1 1 1 2 1 1 1


注意的是計算時的規則與str_detect相同,單純使用" "則為AND,使用範圍[ ]則是OR,以下進行測試,先以不連續字串進行計算,不連續字串"ry"時一開始計算為0,計算方式是將"ry"作為一整個計算項目,若是範圍則是只要單一字元出現就計算一次

# 以不連續字串"ry"計算
str_count(stringr_df$weekday, "ry")

# 輸出結果
r$> str_count(stringr_df$weekday, "ry") [1] 0 0 0 0 0 0 0

# 以不連續字串"[ry]"計算
str_count(stringr_df$weekday, "[ry]")

# 輸出結果
r$> str_count(stringr_df$weekday, "[ry]") [1] 1 1 1 1 2 2 2


連續字串進行計算

# 以連續字串"day"計算
str_count(stringr_df$weekday, "day")

# 輸出結果
r$> str_count(stringr_df$weekday, "day") [1] 1 1 1 1 1 1 1

# 以連續字串"[day]"計算
str_count(stringr_df$weekday, "[day]")

# 輸出結果
r$> str_count(stringr_df$weekday, "[day]") [1] 3 3 3 4 3 3 4

R Packages stringr - str_detect | R包stringr - str_detect

 


str_detect用來檢測字串中是否存在要檢查的項目,可以檢查單一字元、字串,也支援正則表達式,需要注意的是檢查的項目有存在大小寫之分,檢查的結果只以TRUE、FALSE,所以實用性上來說並不是太大。


基本語法

str_detect(dataset$string, 檢查的字元或字串)


可用參數

negate = FALSE,預設FALSE,若為TRUE,則返回相反的檢查結果


有幾點要注意一下

  • " "    >> 準確查找,也就是AND,完全符合才行
  • "[ ]" >> 模糊查找,也就是OR,部分符合即可
  • 小寫與大寫判斷為不同字元,需要完全確定大小寫


建立一個字串的數據框

# 建立數據框
stringr_df <- tibble(
    weekday = c("Sunday", "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday")
    )

# 看一下數據框的內容
r$> stringr_df # A tibble: 7 x 1 weekday <chr> 1 Sunday 2 Monday 3 Tuesday 4 Wednesday 5 Thursday 6 Friday 7 Saturday


檢查是否存在"t" >> 只有周六有小寫的t,大寫的無法檢測,加入參數設定TRUE檢查除了t以外的字元

# 檢查各自串是否存在"t"
str_detect(stringr_df$weekday, "t")

# 輸出結果
r$> str_detect(stringr_df$weekday, "t") [1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE

# 檢查各自串是否存在"t"以外的字元
str_detect(stringr_df$weekday, "t", negate = TRUE)

# 輸出結果
r$> str_detect(stringr_df$weekday, "t", negate = TRUE) [1] TRUE TRUE TRUE TRUE TRUE TRUE FALSE

接下來就需要比較注意,檢測是有區分範圍的,只以" "包圍的字串,檢測的條件為AND,若是以[ ]檢測,檢測的方式則為OR

# 檢查是否存在這三個字元
str_detect(stringr_df$weekday, "riy")

# 輸出結果 >> 全部都為FALSE
r$> str_detect(stringr_df$weekday, "riy") [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE


若是以OR的方式

# 檢查是否存在這三個字元
str_detect(stringr_df$weekday, "[riy]")

# 輸出結果 >> 只要任一個有符合即為TRUE
r$> str_detect(stringr_df$weekday, "[riy]") [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE

R Packages stringr - str_subset | R包stringr - str_subset

 


str_subset用於把有符合查詢的字元或字串整個提取出來,這個函數有一個相同功能的函數str_which,也是將符合查詢的字元或字串提取出來,不過提取的是位置,也就是輸出為數字,以下列出幾個例子供大家參考


基本語法

str_subset(dataset$string, 檢查的字元或字串)

str_which(dataset$string, 檢查的字元或字串)


可用參數

negate = TRUE,預設FALSE,設定為TRUE則返回相反結果


有幾點要注意一下

  • " "    >> 準確查找,也就是AND,完全符合才行
  • "[ ]" >> 模糊查找,也就是OR,部分符合即可
  • 小寫與大寫判斷為不同字元,需要完全確定大小寫


設定一組包含NA的數據集

# 包含NA
stringr_df <- tibble(
    weekday = c("Sunday", "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", NA,"Saturday")
    )


# 輸出結果
r$> stringr_df # A tibble: 8 x 1 weekday <chr> 1 Sunday 2 Monday 3 Tuesday 4 Wednesday 5 Thursday 6 Friday 7 NA 8 Saturday


透過str_subset與str_which進行查找,可以看到str_subset是將符合的整個提取,而str_which則是返回有"a"的字串位置,這裡有一點須注意,就是NA並不在查找範圍,所以不管事字串還是位置,都不會返回NA的結果

# 將有"a"的字串提取出來
str_subset(stringr_df$weekday, "a")

# 輸出結果
r$> str_subset(stringr_df$weekday, "a") [1] "Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" [7] "Saturday"

# 將有"a"的字串位置提取出來
str_which(stringr_df$weekday, "a")

# 輸出結果 >> 跳過NA的位置
r$> str_which(stringr_df$weekday, "a") [1] 1 2 3 4 5 6 8


查找的規則也與其他函數相同," "進行AND(精確)查找,[ ]進行OR(模糊)查找,大小寫的查找也不相同。

# 精確查找包含"ab"的字串
str_subset(stringr_df$weekday, "ab")

# 輸出結果
r$> str_subset(stringr_df$weekday, "ab") character(0)

# 模糊查找有"ab"的字串
str_subset(stringr_df$weekday, "[ab]")

# 輸出結果
r$> str_subset(stringr_df$weekday, "[ab]") [1] "Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" [7] "Saturday"


# 精確查找包含"ab"的字串
str_which(stringr_df$weekday, "ab")

# 輸出結果
r$> str_which(stringr_df$weekday, "ab") integer(0)

# 模糊查找有"ab"的字串
str_which(stringr_df$weekday, "[ab]")

# 輸出結果
r$> str_which(stringr_df$weekday, "[ab]") [1] 1 2 3 4 5 6 8


加入參數設定為TRUE

# 精確查找不包含"ab"的字串
str_subset(stringr_df$weekday, "ab", negate = TRUE)

# 輸出結果
r$> str_subset(stringr_df$weekday, "ab", negate = TRUE) [1] "Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" [7] "Saturday"

# 精確查找不包含"ab"的字串
str_which(stringr_df$weekday, "ab", negate = TRUE)

# 輸出結果
r$> str_which(stringr_df$weekday, "ab", negate = TRUE) [1] 1 2 3 4 5 6 8

其他文章

看看精選文章

納希克房價分析 | Nashik Apartment Price Analyze – 語法解析(上)

  這次 Nashik 的房價分析有上傳至 Kaggle ,有興趣的朋友可以前往閱覽, RMarkdown PDF 報告存放在 Google 雲端,程式碼則是存放於 Github ,照慣例會分享好用的函式語法,雖說基本的 Packages 與語法可能很多人都會完整的閱覽,但是實際...