2015-04-22 3 views
2

Предположим, у меня есть таблица возрастов:Recode таблица в R

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

Предположим теперь я хочу, чтобы свернуть свою таблицу возрастов в 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)

Однако это довольно интенсивный способ сделать это.

Итак, мой вопрос: есть ли лучший способ перекодировать таблицу непредвиденных обстоятельств?

+0

будет ли это работать с нерегулярными новыми точками? – mzuba

+0

Код должен был сделать ваши первые строки кода более компактными. – akrun

ответ

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] 
Смежные вопросы