在R中,我想计算总数的百分比,但总数是行数

时间:2016-06-03 21:09:48

标签: r

我有一个如下所示的数据集:

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中这样做?谢谢!

2 个答案:

答案 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