如何在r中通过第二列聚合和合并一列

如何在r中通过第二列聚合和合并一列,r,merge,aggregate,R,Merge,Aggregate,在我目前的研究中,我意外地经常遇到这个问题。假设我有一个数据框,里面有美国各州的总消费量。我想使用县人口(我有)来估计县的消费量(我没有)。人口数据通常以长格式排列,列分别代表县、州和人口。如果消费数据被称为cons,人口数据框被称为pop,那么我解决问题的常用算法如下: #data pop <- as.data.frame(rnorm(12)+4) pop$county <- letters[10:21] pop$state <- c("A", "

在我目前的研究中,我意外地经常遇到这个问题。假设我有一个数据框,里面有美国各州的总消费量。我想使用县人口(我有)来估计县的消费量(我没有)。人口数据通常以长格式排列,列分别代表县、州和人口。如果消费数据被称为
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
#数据

你在找这样的东西吗

使用
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.
require(dplyr)
流行音乐%>%
左连接(cons)%>%
按(州)分组%>%
变异(share_cons=cons*(pop/sum(pop)))
加入,按=“州”
#一个tibble:12x5
#分组:国家[3]
波普县的州犯人共用犯人
1 3.63 j A 100000 23226。
2 4.09 k A 100000 26157。
3.71L A 100000 23763。
4.20 m A 100000 26854。
5.32北纬40000 14913。
6 3.59海外40000 10062。
7 5.36便士40000 15026。
8 4.06 q C 80000 16029。
9 1.77 r C 80000 6985。
10 4.45南卡罗来纳州80000 17568。
11 5.38 t C 80000 21228。
12 4.61 u C 80000 18190。

你在找这样的东西吗

使用
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.
require(dplyr)
流行音乐%>%
左连接(cons)%>%
按(州)分组%>%
变异(share_cons=cons*(pop/sum(pop)))
加入,按=“州”
#一个tibble:12x5
#分组:国家[3]
波普县的州犯人共用犯人
1 3.63 j A 100000 23226。
2 4.09 k A 100000 26157。
3.71L A 100000 23763。
4.20 m A 100000 26854。
5.32北纬40000 14913。
6 3.59海外40000 10062。
7 5.36便士40000 15026。
8 4.06 q C 80000 16029。
9 1.77 r C 80000 6985。
10 4.45南卡罗来纳州80000 17568。
11 5.38 t C 80000 21228。
12 4.61 u C 80000 18190。

你好!你能提供一个最小的可复制的例子吗?你能分享你的数据的一个可复制的例子吗?@grouah我试着用mock dataHello@pkppkafa添加一个例子,我的答案有用吗?如果是,请毫不犹豫地接受答案。您好!您能提供一个最小的可复制示例吗?您能分享您的数据的可复制示例吗?@grouah我尝试添加一个模拟数据的示例Hello@pkppkafa,我的答案有用吗?如果是,请毫不犹豫地接受答案。