我有一个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
怎么做?
在Base-R中
SalesByZip <- sapply(split(df1$Sales,df1$ZIP), sum)
df2$Sales <- lapply(df2$ZIP, function(x) SalesByZip[grepl(x, names(SalesByZip))] )
> df2
ZCTA ZIP Population Sales
6 60657 60657 82739 4
7 60609 60609 64906
10 60612 60612 33472
13 60641 60641 40603 2
14 60616 60616 48433
15 60607 60607 84155 1
16 60628 60628 92084 1
17 60619 60619 63825
编辑:
如果您希望零实际上位于列表中,只需添加
df2$Sales[sapply(df2$Sales,length)==0] <- 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
说明:
SalesByZip <- sapply(split(df1$Sales,df1$ZIP), sum)
在这里,我们使用来分割df1中的数据。split(df1$Sales,df1$ZIP)
这仅返回用邮政编码分隔的销售额。然后将其包裹起来,sapply(..., sum)
将每个分割相加。
现在,lapply(df2$ZIP, ... )
这将一次将一行代码传递df2$ZIP
到我们的函数中。function(x) SalesByZip[grepl(x, names(SalesByZip))]
该函数正在访问SalesByZip
与我们传递到函数中的ZIP匹配的对应值。
发表评论:
以下解决方案添加了zereo,但没有上面添加的行,并确保class(df2$Sales)
="numeric"
SalesByZip <- sapply(split(df1$Sales,df1$ZIP), sum)
df2$Sales <- sapply(df2$ZIP, function(x){x<-SalesByZip[grepl(x, names(SalesByZip))];ifelse(length(x)==0,0,x)} )
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句