首页 > 解决方案 > 如何根据单独数据框中两列的结果在数据框中创建新列?

问题描述

我有一个df1:

   ZIP Weekend Sales
1 60657       1    2
2 60657       1    1
3 60657       1    1
4 60641       0    2
5 60641       0    NA
6 60607       0    0
7 60607       0    1
8 60628       0    1

还有一个单独的df2:

    ZCTA   ZIP Population
6  60657 60657      82739
7  60609 60609      64906
10 60612 60612      33472
13 60641 60641     40603
14 60616 60616      48433
15 60607 60607      84155
16 60628 60628      92084
17 60619 60619      63825

我想为 df2 增加两列。一列将是 SalesSum。我想总结每个邮政编码的总销售分数,如下所示:

输出:

    ZCTA   ZIP Population   Sales
6  60657 60657      82739    4
7  60609 60609      64906    0
10 60612 60612      33472    0 
13 60641 60641      40603    2
14 60616 60616      48433    0
15 60607 60607      84155    1
16 60628 60628      92084    1
17 60619 60619      63825    0

这是怎么做到的?

标签: rdataframe

解决方案


我提出这个答案有点tidyverse

df <- read.table("df1.txt")
df2 <- read.table("df2.txt")

library(tidyverse)

#aggregate by ZIP
tt <- df %>% group_by(ZIP) %>% summarise(Sales = sum(Sales))
tt

# create the new column
df2$Sales <- 0

# add values at the right place
df2[match(tt$ZIP, df2$ZIP), ]$Sales <- tt$Sales

###### a more tidyverse version (Mike idea) #####
df2 <- left_join(df2, tt, by = "ZIP")

# to supress NA without tidy
df2$Sales[is.na(df2$Sales)] = 0

df2:

   ZCTA   ZIP Population Sales
6  60657 60657      82739     4
7  60609 60609      64906     0
10 60612 60612      33472     0
13 60641 60641      40603     2
14 60616 60616      48433     0
15 60607 60607      84155     1
16 60628 60628      92084     1
17 60619 60619      63825     0

推荐阅读