資料處理如同炒菜的備菜準備,如果沒有把備菜處理好,後續開始炒菜就有可能會發生備菜不完整的問題需要處理(入口感、熟度等等)。所以在資料處理的階段,都是為了後續輸出不同結果的完整性、清晰度。讓我們來看看一些範例吧!
- 程式碼範例:
# 資料整理
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) 寬轉長: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- 處理複雜字串: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-
處理缺失值 (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) R 軟體
- (2) Gemini