Как агрегировать и объединить один столбец со вторым столбцом в r - PullRequest
1 голос
/ 14 июля 2020

В моем текущем исследовании я удивительно часто сталкиваюсь с этой конкретной проблемой. Скажем, у меня есть фрейм данных с общим потреблением во всех штатах США. Я хочу использовать население округа (которое у меня есть) для оценки потребления по округам (которого у меня нет). Данные о населении обычно располагаются в длинном формате со столбцами, представляющими округ, штат и население соответственно. Если данные о потреблении называются 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

Кто-нибудь может придумать более простой способ сделать это, используя только одну или две функции?

1 Ответ

0 голосов
/ 14 июля 2020

Вы ищете что-то подобное?

Используя dplyr:

require(dplyr)
pop %>% 
  left_join(cons) %>% 
  group_by(state) %>% 
  mutate(share_cons=cons*(pop/sum(pop)))

Joining, by = "state"
# A tibble: 12 x 5
# Groups:   state [3]
     pop county state   cons share_cons
   <dbl> <chr>  <chr>  <dbl>      <dbl>
 1  3.63 j      A     100000     23226.
 2  4.09 k      A     100000     26157.
 3  3.71 l      A     100000     23763.
 4  4.20 m      A     100000     26854.
 5  5.32 n      B      40000     14913.
 6  3.59 o      B      40000     10062.
 7  5.36 p      B      40000     15026.
 8  4.06 q      C      80000     16029.
 9  1.77 r      C      80000      6985.
10  4.45 s      C      80000     17568.
11  5.38 t      C      80000     21228.
12  4.61 u      C      80000     18190.
...