Что-то вроде следующего в 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),