В моем текущем исследовании я удивительно часто сталкиваюсь с этой конкретной проблемой. Скажем, у меня есть фрейм данных с общим потреблением во всех штатах США. Я хочу использовать население округа (которое у меня есть) для оценки потребления по округам (которого у меня нет). Данные о населении обычно располагаются в длинном формате со столбцами, представляющими округ, штат и население соответственно. Если данные о потреблении называются cons
, а фрейм данных о населении - pop
, мой обычный алгоритм решения проблемы будет примерно таким:
#data
pop <- as.data.frame(rnorm(12)+4)
pop$county <- letters[10:21]
pop$state <- c("A", "A", "A", "A", "B", "B", "B", "C", "C", "C","C","C")
colnames(pop)[1] <- "pop"
cons <- as.data.frame(c(10^5, 4*10^4, 8*10^4))
colnames(cons) <- "cons"
cons$state <- c("A", "B", "C")
agg_pop <- aggregate(list(pop_state = pop$pop), by = list(state = pop$state), FUN = sum, na.rm = T) # aggregating population by state
pop <- merge(pop, agg_pop, by = "state") # Merging the state population with the county population data
pop$share <- pop$pop/pop$pop_state # Calculating each county's share of state population
pop <- merge(pop, cons, by = "state") # Merging consumption data onto population data
pop$estimated_cons <- pop$cons * pop$share # multiplying county's share of state population with state consumption
Кто-нибудь может придумать более простой способ сделать это, используя только одну или две функции?