Как разделить данные на один столбец и использовать другую информацию для создания столбцов? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть фрейм данных (df), в котором для каждого идентификатора компании есть идентификатор DirectorID и период, в котором они там работали (с начала года до конца года).

Я хотел бы разделить данные по 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

Пожалуйста, кто-нибудь может мне посоветовать? Спасибо.

1 Ответ

0 голосов
/ 07 мая 2018

Используйте tidyr::expand, чтобы охватить все годы для комбинации CompanyID и DirectorID. Тогда 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)
...