如何将'event'数据转换为面板数据?
How to convert 'event' data to panel data?
我有一些零售分店的数据以及它们关闭的日期,如果它们没有关闭,那么这就是 NA。我想扩展这些数据,使它们成为一个面板,带有 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 中的最佳解决方案?有没有人有类似的经历可以与我分享?谢谢
要生成的问题代码 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
通过修剪缺失、重命名 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
我有一些零售分店的数据以及它们关闭的日期,如果它们没有关闭,那么这就是 NA。我想扩展这些数据,使它们成为一个面板,带有 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 中的最佳解决方案?有没有人有类似的经历可以与我分享?谢谢
要生成的问题代码 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
通过修剪缺失、重命名 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