在R中创建具有插值数据的扩展矩阵

时间:2014-11-13 17:36:06

标签: r matrix interpolation apply

我有一个数据框,其中包含MSA的人口年度数据。它们的组织如下:

 MSA    FIPS  x1969 x1970 x1971 .... x2012
Akron   123    12    14    17  ....   22
Miami   234    23    20    24  ....   29
etc.

我需要将数据重塑为

 MSA FIPS Year Data
 Akron 123 1969 12
 Akron 123 1970 14
 Akron 123 1971 17

...

我可以使用“融化”来做到这一点,但我也想插入这些年度数据,以包括全时系列的季度数据点。那么,如何最好地动态创建季度(插值)矩阵?

我可以在上面的第一个矩阵的行上使用循环,然后使用melt来重新整形新数据,但是当我发现自己构建明确编码的循环时,我被要求自己拍打。

我一直在修补“apply”,但它会创建一个列表列表 - 然后需要汇总最终的数据框。

我觉得必须有一个简单的解决方案。

谢谢,克里斯。

2 个答案:

答案 0 :(得分:0)

您可以尝试td

中的tempdisagg
library(tempdisagg)
library(reshape2)
library(zoo)

dM <- transform(melt(df, id.var=c('MSA', 'FIPS')), 
            variable=as.numeric(gsub('^x', '', variable)))

res <- lapply(split(dM, dM$MSA), function(x) {
           val <- ts(x$value, start=x$variable[1], end=x$variable[nrow(x)])
           val2 <-predict(td(val~1, to='quarterly', method='uniform')) 
          #change the options as needed
          data.frame(yearQtr= as.yearqtr(time(val2)), val=val2)})

数据

df <- structure(list(MSA = c("Akron", "Miami"), FIPS = c(123L, 234L
 ), x1969 = c(12L, 23L), x1970 = c(14L, 20L), x1971 = c(17L, 24L
)), .Names = c("MSA", "FIPS", "x1969", "x1970", "x1971"), class = "data.frame",
row.names = c(NA, -2L))

答案 1 :(得分:0)

这建立在@akrun之前:

#His data frame build:

df <- structure(list(MSA = c("Akron", "Miami"), FIPS = c(123L, 234L),
      x1969 = c(12L, 23L), x1970 = c(14L, 20L), x1971 = c(17L, 24L)),
     .Names = c("MSA", "FIPS", "x1969", "x1970", "x1971"), class = "data.frame",
     row.names = c(NA, -2L))

#His set up:

dM <- transform(melt(df, id.var=c('MSA', 'FIPS')),
        variable=as.numeric(gsub('^x', '', variable)))

#My variation on his lapply:

res <- lapply(split(dM, dM$MSA), function(x) {
       xseq=seq(min(x$variable),max(x$variable),by=.25)
       val <- approx(x$variable,x$value,xout=xseq)
       data.frame(yearQtr=xseq,val=val$y)})

df.new <- do.call(rbind.data.frame,res)

它不太完美,但我稍后会再回来。我们关闭了。谢谢@akrun