2

各観測値が333地区の1つであるデータファイル(.csv)があります。各地区には、1101、1102、...のようなIDがあります。次に、別のデータファイル(.csv)があり、各観測値は、人口データを含む112,975の町の1つです。町のデータにはdistrict_IDフィールドがあります。地区ごとに約300の町があります。つまり、1つの地区district_ID == 1101と約300の町がありdistrict_ID == 1101ます。

地区データセットに地区レベルの人口変数を作成したいと思います。これは、複数の町の観測値を各単一の地区の観測値と照合し、町レベルの人口を合計することを意味します。

ありがとうございました!

4

3 に答える 3

7

data.tableソリューション:

#some example data
set.seed(42)
districts <- data.frame(district_ID=1:10,whatever=rnorm(10))
towns <- data.frame(town=1:100,district_ID=rep(1:10,each=10),
                    population=rpois(100,sample(c(1e3,1e4,1e5))))

library(data.table)
districts <- data.table(districts,key="district_ID")
towns <- data.table(towns,key="district_ID")

#calculate district population
temp <- towns[,list(district_pop=sum(population)),by=district_ID]
#merge result with districts data.table
districts <- merge(districts,temp)

#    district_ID    whatever district_pop
# 1:           1  1.37095845       434886
# 2:           2 -0.56469817       334084
# 3:           3  0.36312841       342241
# 4:           4  0.63286260       433224
# 5:           5  0.40426832       334039
# 6:           6 -0.10612452       342810
# 7:           7  1.51152200       433362
# 8:           8 -0.09465904       333810
# 9:           9  2.01842371       342035
# 10:          10 -0.06271410       432302
于 2013-03-16T18:04:18.680 に答える
4

編集:より大きなデータセットのベンチマーク。

Tapply関数を使用して各地区の人口を計算します。

districtdata$population<-
  tapply(towndata$population,towndata$district_ID,sum)[districts$district_ID]

楽しみのために、いくつかのベンチマーク:

fn1<-function(districts,towns) 
{
  districts$population<-
       tapply(towns$population,towns$district_ID,sum)[districts$district_ID]

  districts
}
fn2<-function(districts,towns) #Roland's data.table approach:
{ 
  districts <- data.table(districts,key="district_ID")
  towns <- data.table(towns,key="district_ID")
  temp<-towns[,list(district_pop=sum(population)),by=district_ID]
  merge(districts,temp)
}



set.seed(42)
districts <- data.frame(district_ID=1:300,whatever=rnorm(300))
towns <- data.frame(town=1:100000,district_ID=rep(1:300,each=300),
                    population=rpois(300000,sample(c(1e3,1e4,1e5))))

microbenchmark(fn1(districts,towns),fn2(districts,towns))
Unit: milliseconds
                  expr       min        lq    median        uq       max neval
 fn1(districts, towns) 215.29266 231.47103 243.72353 265.28280 355.43895   100
 fn2(districts, towns)  20.03636  27.51046  36.11116  58.56448  88.70766   100
于 2013-03-16T17:56:45.630 に答える
1

どうですか:

aggregate(population ~ district_ID, towns, sum)

(ローランドの合成データに基づく)

于 2013-03-16T19:20:56.243 に答える