搜尋感興趣的網誌

所有文章連結

2022年3月23日 星期三

R Packages dplyr - arrange | R包介紹dplyr - arrange

 


基本語法

arrange(dataset, 排序方式)


輔助函數

`dese()` >> 排序方式更改

*原始排序規則 >> 由小到大


類似函數

`ordered()` >> 不只是排序,以因子作為等級畫分進行,與arrange還是有使用上的差異

可以參考 >> 共享單車Cyclistic案例分析 - 語法解析(中)


當我們整理完資料需要檢視時,常常會看到一堆亂七八糟的數值,很難看的出有無甚麼特殊的規則,就像下列輸出結果

# 輸出結果
r$> # arrange dplyr_operate[1:10, ] %>% select(ride_length, ride_length_minutes) ride_length ride_length_minutes 1 446 7.433333 2 1048 17.466667 3 252 4.200000 4 357 5.950000 5 1007 16.783333 6 257 4.283333 7 548 9.133333 8 383 6.383333 9 2137 35.616667 10 2120 35.333333


這時我們就可以使用arrange重新進行排序進行檢視

# 直接進行排序
arrange(dplyr_arrange, ride_length)

# 輸出結果
r$> arrange(dplyr_arrange, ride_length) ride_length ride_length_minutes 3 252 4.200000 6 257 4.283333 4 357 5.950000 8 383 6.383333 1 446 7.433333 7 548 9.133333 5 1007 16.783333 2 1048 17.466667 10 2120 35.333333 9 2137 35.616667


加入desc()函數檢視

# desc排序
arrange(dplyr_arrange, desc(ride_length))

# 輸出結果
r$> arrange(dplyr_arrange, desc(ride_length)) ride_length ride_length_minutes 9 2137 35.616667 10 2120 35.333333 2 1048 17.466667 5 1007 16.783333 7 548 9.133333 1 446 7.433333 8 383 6.383333 4 357 5.950000 6 257 4.283333 3 252 4.200000


有多個變數一起進行

# 小時升序,日期降序
arrange_operate <- dplyr_operate %>%
    arrange(
        hour,
        desc(day))

# 輸出結果
r$> arrange_operate[1:10, ] hour day ride_length_minutes 613603 0 31 50.766667 613604 0 31 14.133333 613605 0 31 2.933333 613606 0 31 15.333333 613607 0 31 49.433333 613608 0 31 21.950000 613609 0 31 27.033333 613610 0 31 13.600000 613611 0 31 12.516667 613612 0 31 26.350000



當進行字符的操作時,會以字母的原始排序進行

# 創造數據框
letter_arrange <- tibble(
    letter = c("zero", "apple", "orange", "gold"),
    number = c(1, 5, 7, 3)
    )

# 進行升序
arrange(letter_arrange, letter)

# 輸出結果
r$> arrange(letter_arrange, letter) # A tibble: 4 x 2 letter number <chr> <dbl> 1 apple 5 2 gold 3 3 orange 7 4 zero 1

# 進行降序
arrange(letter_arrange, desc(letter))

# 輸出結果
r$> arrange(letter_arrange, desc(letter)) # A tibble: 4 x 2 letter number <chr> <dbl> 1 zero 1 2 orange 7 3 gold 3 4 apple 5











R Packages dplyr - filter | R包dplyr - filter

 


filter篩選的方式與寫法會比較複雜,除了一般篩選,也可以進行運算符、接近值篩選等等,創造出更多不同型態的數據資料。

基本語法

filter(dataset,   變量篩選條件..)

可以搭配的函數

  • 比較運算符 `==`,`!=`,`>`,`<`,`>=`,`<=`
  • 邏輯運算符 `&`,`|`,`!`,`xor()`
  • 之間或接近值篩選 `between()`,`near()`

 

先載入dplyr

library(dplyr)

 

一部分會以Cyclistic數據集作演示,先載入看一下資料內容

# 載入數據
cyclistic_dplyr <- read.csv("combine_datas_clearn.csv")
dplyr_operate <- cyclistic_dplyr

# 檢視數據
r$> str(dplyr_operate) 'data.frame': 3876042 obs. of 16 variables: $ ride_id : chr "22178529" "22178530" "22178531" "22178532" ... $ started_at : chr "2019-04-01 00:02:22" "2019-04-01 00:03:02" "2019-04-01 00:11:07" "2019-04-01 00:13:01" ... $ ended_at : chr "2019-04-01 00:09:48" "2019-04-01 00:20:30" "2019-04-01 00:15:19" "2019-04-01 00:18:58" ... $ rideable_type : chr "6251" "6226" "5649" "4151" ... $ start_station_id : int 81 317 283 26 202 420 503 260 211 211 ... $ start_station_name : chr "Daley Center Plaza" "Wood St & Taylor St" "LaSalle St & Jackson Blvd" "McClurg Ct & Illinois St" ... $ end_station_id : int 56 59 174 133 129 426 500 499 211 211 ... $ end_station_name : chr "Desplaines St & Kinzie St" "Wabash Ave & Roosevelt Rd" "Canal St & Madison St" "Kingsbury St & Kinzie St" ... $ member_casual : chr "member" "member" "member" "member" ... $ year : int 2019 2019 2019 2019 2019 2019 2019 2019 2019 2019 ... $ month : chr "April" "April" "April" "April" ... $ week : chr "Monday" "Monday" "Monday" "Monday" ... $ day : int 1 1 1 1 1 1 1 1 1 1 ... $ hour : int 0 0 0 0 0 0 0 0 0 0 ... $ ride_length : int 446 1048 252 357 1007 257 548 383 2137 2120 ... $ ride_length_minutes: num 7.43 17.47 4.2 5.95 16.78 ...


一般篩選情形,篩選出會員是casual的

# 有兩種會員
unique(dplyr_operate$member_casual)

# 輸出結果
r$> unique(dplyr_operate$member_casual) [1] "member" "casual"

# 篩選出休閒會員
filter_casual <- filter(
    dplyr_operate,
    member_casual == "casual"
    )
unique(filter_casual$member_casual)

# 輸出結果
r$> unique(filter_casual$member_casual) [1] "casual"


需要注意的是”==”,單獨一個”=” R應該是判斷成變量位置而不是取值,會出現error,但是貼心的是error會詢問是否想這樣寫呢~修改就很快了

# 取值方式錯誤
error_df <- filter(
    dplyr_operate,
    member_casual = "casual"
    )

# 輸出結果出現錯誤
Error: Problem with `filter()` input `..1`. x Input `..1` is named. i This usually means that you've used `=` instead of `==`. i Did you mean `member_casual == "casual"`?


加入比較運算篩選條件,除了會員不是casual之外,騎行時間要超過30分鐘

# 加入比較運算符
filter_compare <- filter(
    dplyr_operate,
    member_casual != "casual",
    ride_length_minutes >= 30
)

# 確認篩選的正確性
max(filter_compare$ride_length_minutes)
min(filter_compare$ride_length_minutes)
unique(filter_compare$member_casual)

# 結果輸出
r$> max(filter_compare$ride_length_minutes) min(filter_compare$ride_length_minutes) unique(filter_compare$member_casual) [1] 150943.9 [1] 30 [1] "member"


加入邏輯運算篩選,篩選出星期一,騎行時間介於1~2分鐘

# 加入邏輯運算
filter_logic <- filter(
    dplyr_operate,
    week == "Monday",
    ride_length_minutes >= 1 & ride_length_minutes <= 2
)

# 結果輸出
r$> max(filter_logic$ride_length_minutes) min(filter_logic$ride_length_minutes) unique(filter_logic$week) [1] 2 [1] 1 [1] "Monday"


between函數語法

between(變數, 左邊範圍, 右邊範圍)

會找出在左右兩邊的中間所有值,範圍值是有包含設定值,也就是">=","<="

下面篩選出騎行時間介於10~15分鐘的範圍

# between函數用法
filter_between <- filter(
    dplyr_operate,
    between(ride_length_minutes, 10, 15)
)

# 檢查條件範圍
max(filter_between$ride_length_minutes)
min(filter_between$ride_length_minutes)

# 結果輸出
r$> max(filter_between$ride_length_minutes) min(filter_between$ride_length_minutes) [1] 15 [1] 10


接下來的函數near()比較特別,R裡面計算小數點並不是無限,所以有可能造成值的偏差,這時就需要這個函數取接近值,如下所示

(1 / 2) * 2 == 1
[1] TRUE

(1 / 49) * 49 == 1
[1] FALSE


加入near()與接近值

near((1 / 49) * 49, 1)

r$> near((1 / 49) * 49, 1) [1] TRUE




R Packages dplyr - select | R包dplyr - select


select函數在檢視數據與整理的階段可以很輕易的將所需變量找尋、鎖定以至於合併成一個新的數據框,通常會搭配fliter作條件篩選,可以整理出更多想要觀察的變量與值


基本語法

select(dataset, 變量..)


有些輔助函數可以搭配select一併使用,查找上會顯得更為快速,畢竟現在的數據集載入後都有不少的欄位,關於這些輔助函數會一併做演示。


這次拿Cyclistic的數據集作為演示

# 載入數據集
cyclistic_dplyr <- read.csv("combine_datas_clearn.csv")
dplyr_operate <- cyclistic_dplyr[1:6, ]

# 確認數據內容
r$> str(dplyr_operate) 'data.frame': 6 obs. of 16 variables: $ ride_id : chr "22178529" "22178530" "22178531" $ started_at : chr "2019-04-01 00:02:22" "2019-04-01 00 $ ended_at : chr "2019-04-01 00:09:48" "2019-04-01 00 $ rideable_type : chr "6251" "6226" "5649" "4151" ... $ start_station_id : int 81 317 283 26 202 420 $ start_station_name : chr "Daley Center Plaza" "Wood St & Tayl $ end_station_id : int 56 59 174 133 129 426 $ end_station_name : chr "Desplaines St & Kinzie St" "Wabash $ member_casual : chr "member" "member" "member" "member" $ year : int 2019 2019 2019 2019 2019 2019 $ month : chr "April" "April" "April" "April" ... $ week : chr "Monday" "Monday" "Monday" "Monday" $ day : int 1 1 1 1 1 1 $ hour : int 0 0 0 0 0 0 $ ride_length : int 446 1048 252 357 1007 257 $ ride_length_minutes: num 7.43 17.47 4.2 5.95 16.78 ...


一般變數選擇語法,挑出年、月、星期並存到新的變量中

#選出年、月、日
select_df <- select(dplyr_operate, year, month, week)

# 輸出結果
r$> select_df year month week 1 2019 April Monday 2 2019 April Monday 3 2019 April Monday 4 2019 April Monday 5 2019 April Monday 6 2019 April Monday


: >> 範圍選擇

# 範圍選擇
scope_select <- select(dplyr_operate, c(year : day))

# 輸出結果
r$> scope_select year month week day 1 2019 April Monday 1 2 2019 April Monday 1 3 2019 April Monday 1 4 2019 April Monday 1 5 2019 April Monday 1 6 2019 April Monday 1


-c() >> 選出不要的部分輸出

# 剔除不需要的變量欄位
select_norequired <- select(dplyr_operate, -c(
    ride_id,
    started_at,
    ended_at,
    rideable_type,
    start_station_id,
    start_station_name,
    end_station_id,
    end_station_name,
    ride_length,
    ride_length_minutes))

# 輸出結果
r$> select_norequired member_casual year month week day hour 1 member 2019 April Monday 1 0 2 member 2019 April Monday 1 0 3 member 2019 April Monday 1 0 4 member 2019 April Monday 1 0 5 member 2019 April Monday 1 0 6 member 2019 April Monday 1 0


`starts_with()` >> 以開頭作為選擇條件,記得要加" "

# 開頭為st的都要
start_select <- select(dplyr_operate, starts_with(
    "st"
))

# 輸出結果
r$> start_select started_at start_station_id start_station_name 1 2019-04-01 00:02:22 81 Daley Center Plaza 2 2019-04-01 00:03:02 317 Wood St & Taylor St 3 2019-04-01 00:11:07 283 LaSalle St & Jackson Blvd 4 2019-04-01 00:13:01 26 McClurg Ct & Illinois St 5 2019-04-01 00:19:26 202 Halsted St & 18th St 6 2019-04-01 00:19:39 420 Ellis Ave & 55th St


`ends_with()` >> 以結尾作為選擇條件,記得要加" "

# 結尾為e的都要
end_select <- select(dplyr_operate, ends_with(
    "e"
))

# 輸出結果
r$> end_select rideable_type start_station_name end_station_name 1 6251 Daley Center Plaza Desplaines St & Kinzie St 2 6226 Wood St & Taylor St Wabash Ave & Roosevelt Rd 3 5649 LaSalle St & Jackson Blvd Canal St & Madison St 4 4151 McClurg Ct & Illinois St Kingsbury St & Kinzie St 5 3270 Halsted St & 18th St Blue Island Ave & 18th St 6 3123 Ellis Ave & 55th St Ellis Ave & 60th St


`contains()` >> 模糊查找,可以找出包含在內的變量

# 模糊選擇,有ww的都要
contains_select <- select(dplyr_operate, contains("ww"))

# 輸出結果
r$> contains_select rideable_type year 1 6251 2019 2 6226 2019 3 5649 2019 4 4151 2019 5 3270 2019 6 3123 2019

R Packages dplyr - mutate | R包dplyr - mutate

 


mutate()可以依照選擇的欄位變量,創造一個新的變量出來,並且可以使用不同的操作、計算達到數據整理的目的。

 

基本語法

mutate(dataset, new_var = old_var)

 

載入dplyr

library(dplyr)


先設定一個欄位數據做為演示

# 新建tibble框
dplyr_operate <- tibble(id = c(12345,54312))

# 結果輸出
r$> dplyr_operate # A tibble: 2 x 1 id <dbl> 1 12345 2 54312


將舊的名稱變更新的名稱,等於rename()的效果,可以在調整變量時一併處理名稱的部分,除非新舊名稱一樣,否則會留著舊的變量

# 建立欄位變量
mutate(dplyr_operate,
    member_id = id)

# 結果輸出
# A tibble: 2 x 2 id member_id <dbl> <dbl> 1 12345 12345 2 54312 54312


也可以將日期取出並新增新的欄位變量,新增一個tibble的表格,並且利用lubrdate取出其中的日期數值

# 建立表格
data_time <- tibble(
    date = c("2022-01-01 11:50:20", "2022-02-01 11:50:20")
    )
data_time$date <- as.POSIXct(data_time$date)

# 結果輸出
r$> data_time # A tibble: 2 x 1 date <dttm> 1 2022-01-01 11:50:20 2 2022-02-01 11:50:20

# 利用mutate取出值並建立新欄位變量
data_time <- mutate(time, year = year(date))
data_time <- mutate(time, day = mday(date))

# 結果輸出
r$> data_time # A tibble: 2 x 3 date year day <chr> <dbl> <int> 1 2022-01-01 11:50:20 2022 1 2 2022-02-01 11:50:20 2022 1


搭配recode進行變量值的修改

# 建立字符數據框
data_df <- tibble(
    fruit = c("apple", "banana")
    )

# 結果輸出
r$> data_df # A tibble: 2 x 1 fruit <chr> 1 apple 2 banana

# 創造新變量與調整數值
data_df <- mutate(
    data_df,
    new_fruit = recode(fruit, "apple" = "orange")
    )

# 結果輸出
r$> data_df # A tibble: 2 x 2 fruit new_fruit <chr> <chr> 1 apple orange 2 banana banana 


抑或是想要計算後輸出新變量

# 建立數據框
data_calculate <- tibble(
    num = c(1,2,3)
    )

# 結果輸出
r$> data_calculate # A tibble: 3 x 1 num <dbl> 1 1 2 2 3 3

# 增加變量與調整數值
data_calculate <- mutate(
    data_calculate,
    new_num = (num * 10)
    )

# 結果輸出
r$> data_calculate # A tibble: 3 x 2 num new_num <dbl> <dbl> 1 1 10 2 2 20 3 3 30


如果不想新增欄位變數,只要新欄位名 = 舊欄位名舊可以,但是不建議這樣做,一旦出錯舊需要重新來了,在整理數據的階段使用並搭配其他函數能大幅提升整理的效率。

2022年3月22日 星期二

R Packages Introduce dplyr | R包介紹dplyr

 


數據在進行整頓的階段,都會用到一些R Packages來協助程序,dplyr包裡面使用各組動詞進行數據操作,以下為較常使用的基本函數 :

 

`mutate()` : 以現有的欄位加入新的欄位與變量值。

mutate文章連結 >> 請點我

 

`selete()` : 可以根據欄位名做選擇。

 selete文章連結 >> 請點我


`filter() : 篩選個欄位的值,可以添加大於小於、邏輯判斷等。

 filter文章連結 >> 請點我


`summarise()`、`summary()` : 統計欄位內的值作為單個輸出摘要。

summarise文章連結 >> 請點我

 

`arrange()` : 重新進行排序,可以加入`desc()`做順序調整。

arrange文章連結 >> 請點我

 

`group_by()` : 選擇欄位作為群組。

 group_by文章連結 >> 請點我


`bind()` : 合併不同數據集。

bind文章連結 >> 請點我

 

`distinct()` : 類似base包的`unique()`,挑選出唯一的值。

distinct文章連結 >> 請點我

 

dplyr的函數可以與group_by以及%>%通道結合(除了bind()),結構上有一些相同的操作方式 :

1.      第一個參數為數據集

2.      第二個參數為變量的名稱(欄位名稱),各個變量以” , ”作為分隔。

3.      操作完會生成一個新的數據frame,可以用新變量儲存,就不會更動到原始數據集。

其他文章

看看精選文章

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

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