我有一个如下所示的数据集:
ZipCode AGIBand NumReturns
94022总计9530
94022 under25 1850
94022 25to500 890
94022 50to75 730
94022 75to100 570
94022 100to200 1690
94022 over200 3800
94024总计10790
94024 under25 2170
94024 25to500 900
94024 50to75 820
94024 75to100 650
94024 100to200 1970年
94024 over200 4280
(抱歉格式化 - 我在这里新建)
我想为每个邮政编码添加一个占总数百分比的列。例如:
94022 | 25岁以下1850年|总数的百分比= 1850/9530
我怎样才能在R中这样做?谢谢!
答案 0 :(得分:0)
假设您的数据位于数据框'dat'中:
zipCodes <- unique(dat$ZipCode)
totalRows <- dat$AGIBand == "Total"
for (z in zipCodes){
zipRows <- (dat$ZipCode == z)
zipTotalRow <- totalRows & zipRows
zipTotal <- dat$NumReturns[zipTotalRow]
dat$Percentage[zipRows] <- dat$NumReturns[zipRows] / zipTotal
}
答案 1 :(得分:0)
我们可以使用data.table
。将'data.frame'转换为'data.table'(setDT(df1)
),按'ZipCode'分组,我们将'NumReturns'除以'AGIBand'中对应于Total
的'NumReturns'并分配(:=
)将其作为新列'Perc'。
library(data.table)
setDT(df1)[, Perc := 100*(NumReturns/NumReturns[AGIBand=="Total"]) , by = ZipCode]
df1
# ZipCode AGIBand NumReturns Perc
# 1: 94022 Total 9530 100.000000
# 2: 94022 under25 1850 19.412382
# 3: 94022 25to500 890 9.338930
# 4: 94022 50to75 730 7.660021
# 5: 94022 75to100 570 5.981112
# 6: 94022 100to200 1690 17.733473
# 7: 94022 over200 3800 39.874082
# 8: 94024 Total 10790 100.000000
# 9: 94024 under25 2170 20.111214
#10: 94024 25to500 900 8.341057
#11: 94024 50to75 820 7.599629
#12: 94024 75to100 650 6.024096
#13: 94024 100to200 1970 18.257646
#14: 94024 over200 4280 39.666358