【问题标题】:How to transpose panel data into correct form in R如何在 R 中将面板数据转换为正确的形式
【发布时间】:2021-05-09 05:26:42
【问题描述】:

所以我正在努力将我的数据转换为面板数据表单,以便我可以开始分析它。到目前为止,我已经导入并合并了我的 excel 文件,所以我的数据看起来像这样(请记住,真实数据有更多的行和更多的变量)

   Company Name   Date                Market Share  ...5.x  ...6.x  ...7.x  ...8.x
   <chr>          <dttm>              <chr>         <chr>   <chr>   <chr>   <chr>
 1 NA             NA                  FY0           FY-1    FY-2    FY-3    FY-4  
 2 Kimball Elect  2020-06-29 23:00:00 4020          4422    4232    4111    4003
 3 Mercadolibre   2019-12-31 00:00:00 8357          2843    2653    2222    2134
 4 Lazard Ltd     2019-12-31 00:00:00 47700         45061   45050   43280   42281

如您所见,第 1 行用于指定市场份额变量的时间滞后,其中 FY0 等于日期列中的日期,然后 FY-1 是前一年,FY-2 是两个几年前等。在原始的 excel 文件中,市场份额列是多索引的,因此所有滞后都与市场份额列相关联,但是当导入到 R 时,只有 FY0 仍然与市场份额列相关联,所有其他列都是自动填充 '...5.x ...6.x ...7.x ...8.x'。

我基本上想将我的数据转换为如下所示:

    Company Name   Date    Market Share 
 1  Kimball Elect  2020    4020          
 2  Kimball Elect  2019    4422
 3  Kimball Elect  2018    4232
 4  Kimball Elect  2017    4111 
 5  Kimball Elect  2016    4003
 6  Mercadolibre   2019    8357    
 7  Mercadolibre   2018    2843
 8  Mercadolibre   2017    2653
 9  Mercadolibre   2016    2222
 10 Mercadolibre   2015    2134
 11 Lazard Ltd     2019    47700
 12 Lazard Ltd     2018    45061
 13 Lazard Ltd     2017    45050
 14 Lazard Ltd     2016    43280
 15 Lazard Ltd     2015    42281

所以基本上我想以一种使时间滞后成行的方式转置数据,然后将每个滞后(FY0、FY-1、FY-2...' 与由日期列确定的日期/年份相关联减去滞后,即 FY0 = 2020-06-29 所以 FY-1 = 2019-06-29。

提前感谢任何能够提供帮助的人,因为我觉得这在 R 中非常棘手!

【问题讨论】:

    标签: r dataframe tidyverse transpose panel-data


    【解决方案1】:

    一个解决方案如下

    数据

    > example <- data.frame(Company = "Kimball", date = "2020", FY0 = 4200, FY1 = 4210)
    > example
      Company date  FY0  FY1
    1 Kimball 2020 4200 4210
    

    代码

    example %>% 
          tidyr::pivot_longer(., c("FY0", "FY1")) %>% 
                   dplyr::group_by(Company) %>% 
                          dplyr::mutate(Years = as.numeric(date) - (row_number() - 1)) %>%    
                                       dplyr::select(-date, -name)
    

    输出

    # A tibble: 2 x 3
    # Groups:   Company [1]
      Company value Years
      <chr>   <dbl> <dbl>
    1 Kimball  4200  2020
    2 Kimball  4210  2019
    

    编辑

    解决您的疑虑:

    (1) 第一行包含变量FY0, ... 。因此,您只需将第三、第四、...、最后一列的列替换为第一行减去前两列的值,即colnames(df) &lt;- df[1, 3:(ncols(df))]

    (2) row_number() 属于分组!因此,对于每个组,即公司,编号将从 1 重新开始!不用担心。

    【讨论】:

    • 您好陶菲,谢谢。我得到了它背后的直觉,pivot_longer 函数肯定看起来很有用,但我有两个担忧:1. 我如何处理 FY0、FY-1、FY-2 等实际上不是列但实际上是更广泛市场的子集的事实分享专栏? 2. 我在您的 mutate 函数中看到您将年份 = 日期 - 行号,虽然我可以看到这将适用于 1 个公司的示例,但对于第 100 个行号与年?
    • 我编辑了我的解决方案。这能回答你的问题吗?
    猜你喜欢
    • 2021-04-15
    • 2021-11-16
    • 2021-12-29
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多