【问题标题】:How to convert 'event' data to panel data?如何将“事件”数据转换为面板数据?
【发布时间】:2021-12-18 20:55:03
【问题描述】:

我有一些零售分店的数据以及它们关闭的日期,如果它们没有关闭,那么这是 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 中的最佳解决方案?有没有人有类似的经历可以分享给我?谢谢。

【问题讨论】:

    标签: r dataframe dataformat long-format-data


    【解决方案1】:

    生成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
    

    【讨论】:

    • 关闭,但分支 C 也需要编码为 2017 年至 2019 年关闭。我会看看你的代码,看看我是否可以进行修改以实现我想要的。谢谢。
    • 我明白了。这可以通过group_by()fill() 的组合来实现。我更新了我的答案。
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多