2

年齢のテーブルがあるとします。

ages <- array(round(runif(min=10,max=200,n=100)),dim=100,dimnames=list(age=0:99))

ここで、ages テーブルを 5 歳の幅広い年齢グループにまとめたいとします。

これは、さまざまな値を要約することで非常に簡単に実行できます。

ages.5y <- array(NA,dim=20,dimnames=list(age=paste(seq(from=0,to=95,by=5),seq(from=4,to=99,by=5),sep=""))
ages.5y[1]<-sum(ages[1:5])
ages.5y[2]<-sum(ages[6:10)
...
ages.5y[20]<-sum(ages[96:100])

ループを使用して実行することもできます。

for(i in 1:20) ages.5y[i]<-sum(ages[(5*i-4):(5*i)])

ただし、この方法は「通常の」変換には簡単ですが、新しい間隔が不規則な場合、たとえばループ アプローチは実行不可能になります。0-4,5:12,13-24,25-50,60-99.

テーブルの代わりに個別の値がある場合、これは以下を使用して非常に簡単に実行できますcut

flattened <- rep(as.numeric(dimnames(ages)$age),ages) table(cut(flattened,breaks=seq(from=0,to=100,by=5)))

これにより、ランダムなブレークポイントを使用できます。breaks=c(5,10,22,33,41,63,88)

ただし、これはかなりリソースを消費する方法です。

だから、私の質問は次のとおりです。分割表を再コーディングするより良い方法はありますか?

4

1 に答える 1

3

年齢の値にはカットを使用できますが、カウントには使用できません。このような:

ages =0:99
ageCounts = array(round(runif(min=10,max=200,n=100)),dim=100)
groups = cut(ages,breaks=seq(from=-1,to=100,by=5))

次に、それらをグループ化します。私はこれに使用data.tableします:

DT = data.table(ages=ages, ageCounts=ageCounts, groups)
DT[,list(sum=sum(ageCounts)), by=groups]
于 2015-04-22T10:24:46.307 に答える