如何在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,我的答案有用吗?如果是,请毫不犹豫地接受答案。