В некоторых штатах мне нужно объединить округа, используя названия, в меньшее количество географических категорий.В частности, государство А должно иметь только: «Северо-Запад - Северо-Запад» и «Юго-Восток - Юго-Восток».
Вам нужно будет записать правила группировки, например ...
merge_rules = list(
list(State = "A", District = c("North", "West", "North West")),
list(State = "A", District = c("South", "East", "South East"))
)
Необходимо добавить некоторые переменные, такие как Population;но другие, такие как District_code, должны получить NA.
Я бы сделал это, поместив правила слияния в таблицу;выполнение расчетов после слияния;и перебирая неродные ряды.Вот способ data.table ...
library(data.table)
DT = data.table(df)
mDT = rbindlist(lapply(merge_rules, as.data.table), id = "g")
gDT = DT[mDT, on=.(State, District)][, .(
District_code = District_code[NA_integer_],
District = paste(District, collapse = " - "),
Population = sum(Population)
), by=.(g, State)]
rbind(
DT[!mDT, on=.(State, District)],
gDT[, !"g"]
)[order(State, District)]
State District_code District Population
1: A NA North - West - North West 6.0e+06
2: A NA South - East - South East 1.5e+07
3: B 9 AGS 9.0e+06
4: B 7 XYZ 7.0e+06
5: B 8 ZYX 8.0e+06
И, я полагаю, обратный путь похож:
mtib = bind_rows(lapply(merge_rules, as.tibble), .id = "g")
gtib = right_join(df, mtib, by=c("State", "District")) %>%
group_by(g, State) %>% summarise(
District_code = District_code[NA_integer_],
District = paste(District, collapse = " - "),
Population = sum(Population)
)
bind_rows(
anti_join(df, mtib, by=c("State", "District")),
gtib %>% ungroup %>% select(-g)
) %>% arrange(State, District)
# A tibble: 5 x 4
State District_code District Population
<chr> <int> <chr> <dbl>
1 A NA North - West - North West 6000000
2 A NA South - East - South East 15000000
3 B 9 AGS 9000000
4 B 7 XYZ 7000000
5 B 8 ZYX 8000000