我有許多零售分支機構的資料以及它們關閉的日期,如果它們沒有關閉,那么這是不適用的。我想擴展這些資料,使它們成為一個面板,并帶有 0/1 指示器以顯示該分行是否在該年份或隨后的年份關閉。
這是我擁有的資料格式和我想要的資料格式的示例。這里的資料涵蓋了 2015 年到 2019 年的 5 年期間。分行 A、B 和 D 保持營業,但分行 C 于 2016 年關閉,分行 E 于 2019 年關閉。
branch <- LETTERS[1:5]
yearclosed <- c(NA, NA, 2016, NA, 2019)
have.df <- data.frame(branch, yearclosed)
have.df
branch <- c(rep("A",5), rep("B",5), rep("C",5), rep("D",5), rep("E",5))
year <- rep(2015:2019, 5)
closed <-c (rep(0,5), rep(0,5), 0,1,1,1,1, rep(0,5), 0,0,0,0,1)
want.df <- data.frame(branch, year, closed)
want.df
我曾嘗試嘗試從寬格式轉換為長格式,但沒有取得太大進展。我可以寫幾個 for 回圈,但這些通常不是 R 中的最佳解決方案?有沒有人有類似的經歷可以和我分享?謝謝。
uj5u.com熱心網友回復:
從問題生成的代碼 have.df
branch <- LETTERS[1:5]
yearclosed <- c(NA, NA, 2016, NA, 2019)
have.df <- data.frame(branch, yearclosed)
加載庫
library(dplyr)
library(tidyr)
準備have.df通過修邊missings的,重命名yearclosed,并創建一個新的closed列,它是1對每一行。
have.df <-
have.df |>
filter(!is.na(yearclosed)) |>
rename(year = yearclosed) |>
mutate(closed = 1)
使用tidyr::expand_grid()我們可以創建您想要的 data.frame 的前兩列,然后將其與修改后的內容連接have.df以獲得您正在尋找的結果。使用group_by()和fill()我們可以將初始關閉年份之后的所有年份設定為 1.mutate()并coalesce()幫助我們將所有缺失值設定closed為0。
expand_grid(branch = LETTERS[1:5], year = 2015:2019) |>
left_join(have.df) |>
group_by(branch) |>
fill(closed) |>
mutate(closed = coalesce(closed, 0)) |>
print(n = 25)
#> Joining, by = c("branch", "year")
#> # A tibble: 25 × 3
#> branch year closed
#> <chr> <dbl> <dbl>
#> 1 A 2015 0
#> 2 A 2016 0
#> 3 A 2017 0
#> 4 A 2018 0
#> 5 A 2019 0
#> 6 B 2015 0
#> 7 B 2016 0
#> 8 B 2017 0
#> 9 B 2018 0
#> 10 B 2019 0
#> 11 C 2015 0
#> 12 C 2016 1
#> 13 C 2017 1
#> 14 C 2018 1
#> 15 C 2019 1
#> 16 D 2015 0
#> 17 D 2016 0
#> 18 D 2017 0
#> 19 D 2018 0
#> 20 D 2019 0
#> 21 E 2015 0
#> 22 E 2016 0
#> 23 E 2017 0
#> 24 E 2018 0
#> 25 E 2019 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/349895.html
下一篇:如何對已經分組的欄進行分組?
