Сколько категорий в столбце для одной и той же группы в R? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть фрейм данных (df), где у меня есть директора (DirectorID) на два года (2006 и 2007) в 2 разных компаниях (CompanyID) и их пол (M или F).

df <-
CompanyID   Name    Country ISIN     Director_2006  Gender_2006 Director_2007 Gender_2007   
25830      BANKxxx     Austria  AT000504  11734844255     M     11734844255      M       
25830      BANKxxx     Austria  AT000504  187836811559    F      5524344997      F        
25830      BANKxxx     Austria  AT000504    5524344997    F      5524354997      M        
25830      BANKxxx     Austria  AT000504    5524354997    M      5742347684      M        
25830      BANKxxx     Austria  AT000504    6613115791    M      40160443378     M          
12339      BANKyyy     Belgium  AT034003    5524344997    M      5524344997      M        
12339      BANKyyy     Belgium  AT034003    5524354997    M      5524354997      M        

Я хотел бы добавить еще 5 столбцов после каждого гендерного столбца, то есть после "Gender_2006" и "Gender_2007", со следующей информацией:

  • Колонка 1: количество женщин в этой компании в этом году
  • Колонка 2: Число мужчин в этой компании в том году
  • Столбец 3: Если в том году в этой компании есть хотя бы одна женщина, я добавляю число 1, если нет, я добавляю число 0
  • Колонка 4: Процент женщин (F) в этой компании в этом году
  • Столбец 5: Расчет индекса Блау

df_final - это мой ожидаемый конечный результат.

df_final <-
CompanyID  Name  Country  ISIN   Director_2006 Gender_2006 F2006 M2006 Findex2006 Fperce2006  Blauindex2006  Director_2007  Gender_2007  F2007  M2007  Findex2007 Fperce2007  Blauindex2007     
25830    BANKxxx Austria AT000504 11734844255     M        2       3       1           0.4     0.25           11734844255        M         1     4       1         0.25           0.07      
25830    BANKxxx Austria AT000504 187836811559    F        NA      NA     NA            NA     NA              5524344997        F         NA    NA      NA        NA             NA           
25830    BANKxxx Austria AT000504 5524344997      F        NA      NA     NA            NA     NA              5524354997        M         NA    NA      NA        NA             NA
25830    BANKxxx Austria AT000504 5524354997      M        NA      NA     NA            NA     NA              5742347684      M           NA    NA      NA        NA             NA
25830    BANKxxx Austria AT000504 6613115791      M        NA      NA     NA            NA     NA              40160443378     M           NA    NA      NA        NA             NA
12339    BANKyyy Belgium AT034003 5524344997      M        0       2      0             0      0               5524344997      M           0     2       0         0              0
12339    BANKyyy Belgium AT034003 5524354997      M        NA      NA     NA            NA     NA              5524354997      M           NA    NA      NA        NA             NA

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

Мои данные

df <- read.table(text = 
               "CompanyID   Name    Country ISIN     Director_2006  Gender_2006 Director_2007 Gender_2007  
                25830      BANKxxx     Austria  AT000504  11734844255     M     11734844255      M        
                25830      BANKxxx     Austria  AT000504  187836811559    F      5524344997      F       
                25830      BANKxxx     Austria  AT000504    5524344997    F      5524354997      M       
                25830      BANKxxx     Austria  AT000504    5524354997    M      5742347684      M       
                25830      BANKxxx     Austria  AT000504    6613115791    M      40160443378     M         
                12339      BANKyyy     Belgium  AT034003    5524344997    M      5524344997      M       
                12339      BANKyyy     Belgium  AT034003    5524354997    M      5524354997      M",
                header = T, stringsAsFactors = F)

1 Ответ

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

Что-то вроде следующего в dplyr предложении group_by указывает, по какой группе вы группируете, в данном случае companyID. mutate создаст новые строки на основе указанных вами условий. select просто меняет порядок.

library(dplyr)
df  %>% group_by(CompanyID) %>%
    mutate(F2006 = sum(Gender_2006 == "F", na.rm = T),
            M2006 = sum(Gender_2006 == "M", na.rm = T),
            Findex2006 = as.integer(sum(Gender_2006 == "F", na.rm = T)>0),
            Fperce2006 = F2006/(F2006+M2006),
            F2007 = sum(Gender_2007 == "F", na.rm = T),
            M2007 = sum(Gender_2007 == "M", na.rm = T),
            Findex2007 = as.integer(sum(Gender_2007 == "F", na.rm = T)>0),
            Fperce2007 = F2007/(F2007+M2007)) %>% 
    select(-matches("2006|2007"),matches("2006"), matches("2007"))



# A tibble: 8 x 16
# Groups: CompanyID [2]
#   CompanyID Name    Country ISIN     Director_2006 Gender_2006 F2006 M2006 Findex2006 Fperce2006 Director_2007 Gender_2007
#       <int> <fct>   <fct>   <fct>            <dbl> <fct>       <int> <int>      <int>      <dbl>         <dbl> <fct>      
# 1     25830 BANKxxx Austria AT000504   11734844255 M               2     3          1      0.400   11734844255 M          
# 2     25830 BANKxxx Austria AT000504  187836811559 F               2     3          1      0.400    5524344997 F          
# 3     25830 BANKxxx Austria AT000504    5524344997 F               2     3          1      0.400    5524354997 M          
# 4     25830 BANKxxx Austria AT000504    5524354997 M               2     3          1      0.400    5742347684 M          
# 5     25830 BANKxxx Austria AT000504    6613115791 M               2     3          1      0.400   40160443378 M          
# 6     12339 BANKyyy Belgium AT034003    5524344997 M               0     2          0      0        5524344997 M          
# 7     12339 BANKyyy Belgium AT034003    5524354997 M               0     2          0      0        5524354997 M          
# 8     12339 BANKyyy Belgium AT034003            NA <NA>            0     2          0      0                NA <NA> 

Если вам нужны все NA в строках, кроме первого, вы можете изменить мутирование на что-то вроде:

F2006 = ifelse(row_number()==1,sum(Gender_2006 == "F", na.rm = T),NA),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...