R - 基礎練習篇 (tidyr-資料整理)

資料處理如同炒菜的備菜準備,如果沒有把備菜處理好,後續開始炒菜就有可能會發生備菜不完整的問題需要處理(入口感、熟度等等)。所以在資料處理的階段,都是為了後續輸出不同結果的完整性、清晰度。讓我們來看看一些範例吧!

  1. 程式碼範例:
# 資料整理
library(tidyr)
# 資料操作 
library(dplyr)
 
# 建立一個「寬資料」:不同年份的銷量
df_wide <- data.frame(
  store = c("A", "B"),
  year_2022 = c(100, 150),
  year_2023 = c(120, 180)
)
#結果
> print(df_wide)
store year_2022 year_2023
1     A       100       120
2     B       150       180
  1. 欄與列的轉換
  • (1) 寬轉長:pivot_longer()
df_long <- df_wide %>%
  pivot_longer(
    cols = starts_with("year"), # 選擇要轉換的欄位
    names_to = "year",          # 新的分類欄位名稱
    values_to = "sales",        # 新的數值欄位名稱
    names_prefix = "year_"      # 順便移除前綴,只留數字
  )
#結果
> print(df_long)
# A tibble: 4 × 3
store year  sales
<chr> <chr> <dbl>
1 A     2022    100
2 A     2023    120
3 B     2022    150
4 B     2023    180
  • (2) 長轉寬:pivot_wider()
df_back_to_wide <- df_long %>%
  pivot_wider(
    names_from = year, 
    values_from = sales
  )
#結果
> print(df_back_to_wide)
# A tibble: 2 × 3
store `2022` `2023`
<chr>  <dbl>  <dbl>
1 A        100    120
2 B        150    180
  1. 處理複雜字串:separate() & unite()
df_date <- data.frame(info = c("2023/05/20", "2024/06/15"))
 
# 拆分
df_sep <- df_date %>%
  separate(info, into = c("year", "month", "day"), sep = "/")
 
# 合併回原本格式
df_uni <- df_sep %>%
  unite("full_date", year, month, day, sep = "-")
#結果
> print(df_date)
info
1 2023/05/20
2 2024/06/15
> print(df_sep)
year month day
1 2023    05  20
2 2024    06  15
> print(df_uni)
full_date
1 2023-05-20
2 2024-06-15
  1. 處理缺失值 (Missing Values)

    tidyr 也提供了一些優雅的方法來處理 NA:

  • drop_na():直接刪除含有 NA 的列。
  • replace_na():將 NA 替換成特定數值(如 0)。
  • fill():根據上方或下方的數值自動填充(常用於 Excel 轉入的合併儲存格資料)。
  • list():它的作用是將各種不同類型、不同長度的物件(如向量、矩陣、甚至是另一個 list)打包在一起。
df_missing <- data.frame(x = c(1, 2, NA), y = c("A", NA, "B"))
 
# 將 y 欄位的 NA 換成 "Unknown"
df_missing %>% replace_na(list(y = "Unknown"))
#結果
> df_missing <- data.frame(x = c(1, 2, NA), y = c("A", NA, "B"))
> print(df_missing)
x    y
1  1    A
2  2 <NA>
3 NA    B
 
> df_missing %>% replace_na(list(y = "Unknown"))
> print(df_missing)
x       y
1  1       A
2  2 Unknown
3 NA       B
  1. 資料來源:
  • (1) R 軟體
  • (2) Gemini