iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
AI/ ML & Data

資料科學的小筆記系列 第 11

Day11:使用dplyr轉換資料-Vectorized Functions(3)

  • 分享至 

  • xImage
  •  

雜談
因為在新手訓練時間不能回覆他人的留言,導致我不能回覆Day9的邦友回覆(甚至試了兩次QQ)。
在此說明一下:標題會提到Vectorized Functions是因為在dplyr的cheatsheet有提到mutate()可以搭配Vectorized Functions使用,包括lag()及lead()等等,所以就直接採用這個說法。不過我在Day10在查內容時,也有看Window Function的說法,這部分我找時間確認一下再進行修正,感謝obarisk邦友的回覆。

正文
今天來紀錄Ranking相關內容:
dplyr::cume_dist(): 大於等於此值的數量除以所有資料量的比例
dplyr::dense_rank(): 由小到大的排名(名次連續,若有兩個第一名,則數值排名第二的會是第二名)
dplyr::min_rank(): 由小到大的排名(名次連續,若有兩個第一名,則數值排名第二的會是第三名)
dplyr::ntile(): 分成n組
dplyr::percent_rank(): min_rank()的方法,不過數值縮放成0到1的數值
dplyr::row_number(): 給予每個資料的獨特排名

先比較row_number()、min_rank()及dense_rank()的差異

x <- c(5, 1, 3, 2, 2, NA)
row_number(x)
min_rank(x)相同數值會是同樣排名,但名次不連續,故為
dense_rank(x)

https://ithelp.ithome.com.tw/upload/images/20240822/20168607XJHC1kXBoH.png

row_number(x)每個都是獨特的排名,故為(5,1,4,2,3,NA)
min_rank(x)相同數值會是同樣排名,但名次不連續,故為(5,1,4,2,2,NA)
dense_rank(x)相同數值會是同樣排名,名次連續,故為(4,1,3,2,2,NA)

接著利用mtcars進行測試這些函式

mtcars |> mutate(,cume_dist(mpg))

Toyota Corolla 為最大值,故為1.00000
https://ithelp.ithome.com.tw/upload/images/20240822/20168607QLpvxdOpZm.png

將mpg依照大小分成4組

mtcars |> mutate(,ntile(mpg,4))

https://ithelp.ithome.com.tw/upload/images/20240822/20168607NhBeNzuzta.png

今天的小筆記就先到這邊,大家明天見~~

參考資料:

  1. Data transformation with dplyr :: Cheatsheet

上一篇
Day10:使用dplyr轉換資料-Vectorized Functions(2)
下一篇
Day12:使用dplyr轉換資料-Vectorized Functions(4)
系列文
資料科學的小筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
obarisk
iT邦研究生 1 級 ‧ 2024-08-23 22:33:00

那這邊的 "Vectorized Function",跟我指的 "Vectorized Function" 是不同

在 R 裡面,向量化可以指

a. 用 C/C++ 加速的迴圈計算。
舉個例子,R 的矩陣乘法是"向量化"計算。

m <- matrix(1:4, 2, 2)
m %*% m

如果用 R 寫一個迴圈做矩陣乘法,那就不是向量化

b. Vectorize 函數包裝的函數。

library("dplyr")

wedate <- function(s) {
  v <- strsplit(s, "-")
  sprintf("%d-%s-%s", as.numeric(v[[1]][1]) + 1911, v[[1]][2], v[[1]][3])
}
vwedate <- Vectorize(wedate)

da <- data.frame(
  twdates = c("113-09-01", "113-08-01")
)

# 這會算錯,我印象中以前會出錯誤訊息,
# 但是剛剛測試 (R 4.4.1),不會出錯誤訊息,只會計算錯誤 Orz
da |>
  mutate(date = wedate(twdates))
# 2024-09-01, 2024-09-01
  
# 這才會對
da |>
  mutate(date = vwedate(twdates))
# 2024-09-01, 2024-08-01

我要留言

立即登入留言