我有一个数据框,其中包含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”,但它会创建一个列表列表 - 然后需要汇总最终的数据框。
我觉得必须有一个简单的解决方案。
谢谢,克里斯。
答案 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