搜尋感興趣的網誌

所有文章連結

2022年3月30日 星期三

R Packages forcats - fct_inorder | R包forcats - fct_inorder

 


fct_inorde算是一個系列,包含fct_inorder、fct_infreq、fct_insrq,差別在於排序的模式不同,除了修改排序外,並沒有甚麼其他組合方式,排序方式如 : 

fct_inorder : 按照第一次出現的順序

fct_infreq : 按照出現次數

fct_insrq : 按照級別的數值


基本語法

fct_inorder(dataset$var)

fct_infreq(dataset$var)

fct_insrq(dataset$var)


建立數據框包含數字與字元

# 建立數據框
factor_df <- tibble(
    letter = c("c", "b", "a", "a", "c", "a", "b", "a", "c", "b", "b"),
    number = c(1, 2, 3, 2, 1, 1, 1, 2, 3, 1, 1)
)

# 輸出結果
r$> factor_df # A tibble: 11 x 2 letter number <chr> <dbl> 1 c 1 2 b 2 3 a 3 4 a 2 5 c 1 6 a 1 7 b 1 8 a 2 9 c 3 10 b 1 11 b 1


以fct_inorder、infreq進行排序,函數接受字符作為輸入,所以可以不轉換為因子,以下為不轉換因子直接以字符輸入

# 不轉換因子直接輸入
fct_inorder(factor_df$letter)

# 輸出結果
r$> fct_inorder(factor_df$letter) [1] c b a a c a b a c b b Levels: c b a


# 不轉換因子直接輸入
fct_infreq(factor_df$letter)

r$> fct_infreq(factor_df$letter) [1] c b a a c a b a c b b Levels: a b c


轉換為因子後輸入,結果是一樣的

# 將欄位轉換為因子
factor_df$letter <- factor(factor_df$letter)


# 轉換因子後輸入
fct_inorder(factor_df$letter)

# 輸出結果
r$> fct_inorder(factor_df$letter) [1] c b a a c a b a c b b Levels: c b a


# 轉換因子後輸入
fct_infreq(factor_df$letter)

# 輸出結果
r$> fct_infreq(factor_df$letter) [1] c b a a c a b a c b b Levels: a b c


數字欄位進行就需要轉換為因子才能進行,否則會出現ERROR

# 不轉換因子直接輸入
fct_inseq(factor_df$number)

# 輸出結果
r$> fct_inseq(factor_df$number) Error: `f` must be a factor (or character vector).


# 進行轉換
factor_df$number <- factor(factor_df$number)

# 轉換因子後輸入
fct_inseq(factor_df$number)

# 輸出結果
r$> fct_inseq(factor_df$number) [1] 1 2 3 2 1 1 1 2 3 1 1 Levels: 1 2 3

2022年3月29日 星期二

R Packages stringr - str_split | R包stringr - str_split

 



stringr的函數系列進入尾聲,最後一個介紹的是str_split,也就是拆解,拆解完成返回向量或是矩陣的型態


基本語法

str_split(dataset$string, 拆解的字元或字串)

str_split(dataset$string, 拆解的字元或字串, n)


可用參數

simplify = TRUE,預設為FALSE,若為TRUE,則拆解為矩陣

n = 矩陣組數


建立數據框

stringr_df <- tibble(animal = c(
    "dog chase cat",
    "rat eat fish",
    "lion or tiger or wolf")
    )

# 輸出結果
r$> stringr_df # A tibble: 3 x 1 animal <chr> 1 dog chase cat 2 rat eat fish 3 lion or tiger or wolf


將連接的詞句拆解

# 拆解連接詞
str_split(stringr_df$animal, "chase | eat | or")

# 輸出結果
r$> str_split(stringr_df$animal, "chase | eat | or") [[1]] [1] "dog " " cat" [[2]] [1] "rat " " fish" [[3]] [1] "lion " " tiger " " wolf"


# 拆解連接詞並返回矩陣
str_split(stringr_df$animal, "chase | eat | or", simplify = TRUE)

# 輸出結果
r$> str_split(stringr_df$animal, "chase | eat | or", simplify = TRUE) [,1] [,2] [,3] [1,] "dog " " cat" "" [2,] "rat " " fish" "" [3,] "lion " " tiger " " wolf"


拆解完成後返回矩陣型態,n設定為返回的矩陣數,依照設定數字進行拆解返回,僅返回符合設定值的拆解,以例子來看會較清楚,若設定超過字串數,則返回空矩陣

# 拆解連接詞並返回矩陣,n = 1
str_split_fixed(stringr_df$animal, "chase | eat | or", 1)

# 輸出結果
r$> str_split_fixed(stringr_df$animal, "chase | eat | or", 1) [,1] [1,] "dog chase cat" [2,] "rat eat fish" [3,] "lion or tiger or wolf"


# 拆解連接詞並返回矩陣,n = 2
str_split_fixed(stringr_df$animal, "chase | eat | or", 2)

# 輸出結果
r$> str_split_fixed(stringr_df$animal, "chase | eat | or", 2) [,1] [,2] [1,] "dog " " cat" [2,] "rat " " fish" [3,] "lion " " tiger or wolf"


# 拆解連接詞並返回矩陣,n = 3
str_split_fixed(stringr_df$animal, "chase | eat | or", 3)

# 輸出結果
r$> str_split_fixed(stringr_df$animal, "chase | eat | or", 3) [,1] [,2] [,3] [1,] "dog " " cat" "" [2,] "rat " " fish" "" [3,] "lion " " tiger " " wolf"

R Packages stringr - str_replace | R包stringr - str_replace

 



str_replace替換掉原始字串的模式,替換的方式有很多選擇,除了正則表達式之外,甚至能將原始字串更改為NA值、變更大小寫、修改為符號等等,操作上會是個很有趣的函數


基本語法

str_replace(dataset$string, 替換的字元或字串)

str_replace_all(dataset$string, 替換的字元或字串)


可用參數

NA_character_ >> 將字符變更為NA



創建數據框進行替換操作

# 創建數據框
stringr_df <- tibble(animal = c("dog", "cat", "rat", "fish"))

# 輸出結果
r$> stringr_df # A tibble: 4 x 1 animal <chr> 1 dog 2 cat 3 rat 4 fish


文字替換為符號,若不是加了all函數,只會變更第一個遇到的字母

# 文字變更為符號
str_replace(stringr_df$animal, "[oati]", "=")

# 輸出結果
r$> str_replace(stringr_df$animal, "[oati]", "=") [1] "d=g" "c=t" "r=t" "f=sh"


# 文字變更為符號
str_replace_all(stringr_df$animal, "[oati]", "=")

# 輸出結果
r$> str_replace_all(stringr_df$animal, "[oati]", "=") [1] "d=g" "c==" "r==" "f=sh"


文字變更文字,dog >> pig

# 文字變更為文字
str_replace(stringr_df$animal, "do", "pi")

# 輸出結果
r$> str_replace(stringr_df$animal, "do", "pi") [1] "pig" "cat" "rat" "fish"


將指定字元所屬字串變更為NA值

# 將"a"所屬字串變更為NA
str_replace(stringr_df$animal, "a", NA_character_)

# 輸出結果
r$> str_replace(stringr_df$animal, "a", NA_character_) [1] "dog" NA NA "fish"


變更大小寫

# 範圍內字元變更為大寫
str_replace(stringr_df$animal, "[oatig]", toupper)

# 輸出結果
r$> str_replace(stringr_df$animal, "[oatig]", toupper) [1] "dOg" "cAt" "rAt" "fIsh"


# 開頭變更為大寫
str_replace(stringr_df$animal, "^[a-z]", toupper)

# 輸出結果
r$> str_replace(stringr_df$animal, "^[a-z]", toupper) [1] "Dog" "Cat" "Rat" "Fish"


# 所有文字變更大寫
str_replace(stringr_df$animal, "[a-z]+", toupper)

# 輸出結果
r$> str_replace(stringr_df$animal, "[a-z]+", toupper) [1] "DOG" "CAT" "RAT" "FISH"

R Packages stringr - str_match | R包stringr - str_match

 


str_match用法與str_extract用法基本上一樣,差別在於str_extract回傳的是一個list,str_match回傳的是一個陣列


基本語法

str_match(dataset$string, 查找的字元或字串模式)

str_match_all(dataset$string, 查找的字元或字串模式)


有一點要注意一下

  • 小寫與大寫判斷為不同字元,需要完全確定大小寫


stringr_df <- tibble(
    weekday = c("Sunday 4", "Monday", "Tuesday", "Wednesday",
    "Thursday 77", "Friday", "Saturday 335")
    )

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


查找數字與全部,查找結果僅以第一個結果位置作為返回條件,若要返回全部數字,需尾端加上" + ",返回時以陣列型式傳回

# 查找數字
str_match(stringr_df$weekday, "\\d")

# 輸出結果
r$> str_match(stringr_df$weekday, "\\d") [,1] [1,] "4" [2,] NA [3,] NA [4,] NA [5,] "7" [6,] NA [7,] "3"

# 查找全部數字
str_match_all(stringr_df$weekday, "\\d")

# 輸出結果
r$> str_match_all(stringr_df$weekday, "\\d") [[1]] [,1] [1,] "4" [[2]] [,1] [[3]] [,1] [[4]] [,1] [[5]] [,1] [1,] "7" [2,] "7" [[6]] [,1] [[7]] [,1] [1,] "3" [2,] "3" [3,] "5"





R Packages stringr - str_extract | R包stringr - str_extract

 


str_extrac用法上較為困難,提取的部分使用比較複雜的正則表達式去做搜尋與提取,應用在長字串或是不確定字串上較有幫助


基本語法

str_extract(dataset$string, 查找的字元或字串模式)


一些正則表達式,其他的再慢慢補充,R與Python使用" \ "規則是一樣的,需要多加一個" \ "進行定位

  • `//d`    >> 匹配十進制數字
  • `^`      >> 匹配字首
  • `$`      >> 匹配字尾
  • `\\n`    >> 匹配換行符號
  • `[a-z]` >> 匹配a~z(單個)
  • `+`      >> 匹配不只一個


有一點要注意一下

  • 小寫與大寫判斷為不同字元,需要完全確定大小寫


建立個數據框進行查找

stringr_df <- tibble(
    weekday = c("Sunday 4", "Monday", "Tuesday", "Wednesday",
    "Thursday 77", "Friday", "Saturday 335")
    )

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


使用\\d查找數字,查找結果僅以第一個結果位置作為返回條件,若要返回全部數字,需尾端加上" + "

# 查找數字
str_extract(stringr_df$weekday, "\\d")

# 輸出結果
r$> str_extract(stringr_df$weekday, "\\d") [1] "4" NA NA NA "7" NA "3"

# 查找全部數字
str_extract(stringr_df$weekday, "\\d+")

# 輸出結果
r$> str_extract(stringr_df$weekday, "\\d+") [1] "4" NA NA NA "77" NA "335"


以a - z作為查找範圍(不加" + "),僅返回第一個結果

# 查找a-z
str_extract(stringr_df$weekday, "[a-z]")

# 輸出結果
r$> str_extract(stringr_df$weekday, "[a-z]") [1] "u" "o" "u" "e" "h" "r" "a"


以a - z、A - Z作為查找範圍(加" + "),返回全部結果,但不包含數字

# 查找a-z、A-Z
str_extract(stringr_df$weekday, "[A-Z][a-z]+")

# 輸出結果
r$> str_extract(stringr_df$weekday, "[A-Z][a-z]+") [1] "Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" [7] "Saturday"

其他文章

看看精選文章

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

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