在 R 中重新编码表

  • 本文关键字:编码表 r cut recode
  • 更新时间 :
  • 英文 :


假设我有一个年龄表:

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)

但是,这是一种非常资源密集型的方法。

所以,我的问题是:有没有更好的方法来重新编码列联表?

您可以对年龄值使用切割,但不能对计数使用切割。喜欢这个:

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]

最新更新