【问题标题】:How to split the data by one column and use the other information to make columns?如何将数据按一列拆分并使用其他信息制作列?
【发布时间】:2018-10-17 03:50:04
【问题描述】:

我有一个数据框 (df),其中每个 CompanyID 都有 DirectorID 和他们在那里工作的时间段(StartYear 到 EndYear)。

我想按 CompanyID 拆分数据,并为每年(2006-2016 年)使用该年有效的 DirectorID 制作列。 df2 是我的预期输出。

df <-
  DirectorID    CompanyID   StartYear   EndYear
 11734844255        25830        2015      2016  
187836811559        25830        2006      2016  
   196167673        25830        2008      2015  
   401544433        25830        2006      2014  
   401604433        25830        2006      2010  
  5524344997        12339        2011      2016
  5524354997        12339        2014      2016  
  5742347684        12339        2014      2014  
  6613115791        12339        2009      2016

因此,我的预期输出如下所示:

df2 <-
CompanyID   Director_2016   Director_2015   Director_2014   Director_2013   Director_2012   Director_2011   Director_2010   Director_2009   Director_2008   Director_2007   Director_2006       
      25830   11734844255     11734844255    187836811559    187836811559    187836811559    187836811559    187836811559    187836811559    187836811559    187836811559    187836811559           
      25830  187836811559    187836811559       196167673       196167673       196167673       196167673       196167673       196167673       196167673       401544433       401544433
      25830            NA       196167673       401544433       196167673       401544433       401544433       401544433       401544433       401544433       401604433       401604433 
      25830            NA              NA              NA              NA          NA             NA            401604433       401604433       401604433          NA            NA 
      12339    5524344997      5524344997      5524344997      5524344997      5524344997      5524344997      6613115791      6613115791              NA              NA              NA
      12339    5524354997      5524354997      5524354997      6613115791      6613115791      6613115791              NA              NA              NA              NA              NA
      12339    6613115791      6613115791      5742347684              NA              NA              NA              NA              NA              NA              NA              NA
      12339            NA              NA      6613115791              NA              NA              NA              NA              NA              NA              NA              NA

然后我想合并两个不同的数据框。 df3 包含 CompanyName、CompanyCountry 和 ISIN 信息,df4 包含每位董事的性别信息。

df3 <-
CompanyID   CompanyName CountryName     ISIN
    25830       BANKxxx     Austria     AT000504
    12339       BANKyyy     Belgium     AT034003

df4 <-
  DirectorID    Gender
 11734844255         M
187836811559         F
   196167673         M
   401544433         M
   401604433         M 
  5524344997         F
  5524354997         M
  5742347684         M 
  6613115791         M

因此,df5 是我预期的最终输出的开始。

df5 <-
CompanyID   CompanyName CountryName     ISIN    Director_2016   Gender      
    25830      BANKxxx      Austria AT000504      11734844255        M         
                                                 187836811559        F
                                                   5524344997        F   
                                                   5524354997        M      
                                                   6613115791        M

请问,有人可以给我建议吗?谢谢。

【问题讨论】:

    标签: r list dataframe merge split


    【解决方案1】:

    使用tidyr::expand 涵盖CompanyIDDirectorID 组合的所有年份。然后reshape2::dcast 将允许将df2 的数据转换为预期格式:

    library(reshape2)
    library(tidyverse)
    df2 <- df %>% group_by(DirectorID, CompanyID) %>%
      expand(Year = seq(min(StartYear), max(EndYear))) %>%
      group_by(CompanyID, Year) %>% 
      mutate(rn = row_number()) %>%
      dcast(rn+CompanyID~Year,fun.aggregate = NULL, value.var="DirectorID") %>%
      select(-rn)
    

    结果:

    df2
    #   CompanyID         2006         2007         2008         2009         2010         2011         2012         2013         2014         2015         2016
    # 1     25830    401544433    401544433    196167673    196167673    196167673    196167673    196167673    196167673    196167673    196167673  11734844255
    # 2     25830    401604433    401604433    401544433    401544433    401544433    401544433    401544433    401544433    401544433  11734844255 187836811559
    # 3     25830 187836811559 187836811559    401604433    401604433    401604433 187836811559 187836811559 187836811559 187836811559 187836811559           NA
    # 4     25830           NA           NA 187836811559 187836811559 187836811559           NA           NA           NA           NA           NA           NA
    # 5     12339           NA           NA           NA   6613115791   6613115791   5524344997   5524344997   5524344997   5524344997   5524344997   5524344997
    # 6     12339           NA           NA           NA           NA           NA   6613115791   6613115791   6613115791   5524354997   5524354997   5524354997
    # 7     12339           NA           NA           NA           NA           NA           NA           NA           NA   5742347684   6613115791   6613115791
    # 8     12339           NA           NA           NA           NA           NA           NA           NA           NA   6613115791           NA           NA
    

    立即获取df5

    #Use of mutate_at and pmatch to get Gender
    df5 <- df3 %>% inner_join(df2, by="CompanyID") %>%
    mutate_at(vars(starts_with("20")), 
           funs(Gender = df4$Gender[pmatch(., df4$DirectorID)] ))
    

    df5 的一部分展示结果

    df5[,c(1:4,14:15,25:26)]
    
    #   CompanyID CompanyName CountryName     ISIN         2015         2016 2015_Gender 2016_Gender
    # 1     25830     BANKxxx     Austria AT000504    196167673  11734844255           M           M
    # 2     25830     BANKxxx     Austria AT000504  11734844255 187836811559           M           F
    # 3     25830     BANKxxx     Austria AT000504 187836811559           NA           F        <NA>
    # 4     25830     BANKxxx     Austria AT000504           NA           NA        <NA>        <NA>
    # 5     12339     BANKyyy     Belgium AT034003   5524344997   5524344997           F           F
    # 6     12339     BANKyyy     Belgium AT034003   5524354997   5524354997           M           M
    # 7     12339     BANKyyy     Belgium AT034003   6613115791   6613115791           M           M
    # 8     12339     BANKyyy     Belgium AT034003           NA           NA        <NA>        <NA>
    

    数据:

    df <- read.table(text = 
    "DirectorID    CompanyID   StartYear   EndYear
    11734844255        25830        2015      2016  
    187836811559        25830        2006      2016  
    196167673        25830        2008      2015  
    401544433        25830        2006      2014  
    401604433        25830        2006      2010  
    5524344997        12339        2011      2016
    5524354997        12339        2014      2016  
    5742347684        12339        2014      2014  
    6613115791        12339        2009      2016",
    header = TRUE, stringsAsFactors = FALSE)
    
    df3 <- read.table(text = 
    "CompanyID   CompanyName CountryName     ISIN
    25830       BANKxxx     Austria     AT000504
    12339       BANKyyy     Belgium     AT034003",
    header = TRUE, stringsAsFactors = FALSE)
    
    
    df4 <- read.table(text = 
    "DirectorID    Gender
    11734844255         M
    187836811559         F
    196167673         M
    401544433         M
    401604433         M 
    5524344997         F
    5524354997         M
    5742347684         M 
    6613115791         M",
    header = TRUE, stringsAsFactors = FALSE)
    

    【讨论】:

    • 谢谢!你的回答对我很有帮助!
    • @Tfg1005 很高兴知道它对您有所帮助。这花了一些时间,但我可以把它放在正确的方向。可能你已经知道了,但我想我应该建议你看看stackoverflow.com/help/someone-answers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多