【发布时间】:2013-08-29 20:53:46
【问题描述】:
我有一个数据框,其中包含每 4 或 5 年的数据。我希望插入数据框以外的年份数据,并对数据框两端的列进行外插数据。
我已经能够使用下面的代码执行插值。唯一的问题是中间的列被重复并且必须删除一个副本。有没有更有效的插值方法?我也不确定如何攻击外推。实际数据集包含 12 年(列)的可用数据。
感谢您的任何建议。
my.data <- read.table(text = '
y1980 y1985 y1990
0.10 0.20 0.40
1.00 2.00 4.00
10.00 20.00 40.00
', header = TRUE, na.string='NA', stringsAsFactors=FALSE)
desired.result <- read.table(text = '
y1978 y1979 y1980 y1981 y1982 y1983 y1984 y1985 y1986 y1987 y1988 y1989 y1990 y1991 y1992
0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.20 0.24 0.28 0.32 0.36 0.40 0.44 0.48
0.60 0.80 1.0 1.2 1.4 1.6 1.8 2.0 2.4 2.8 3.2 3.6 4.0 4.4 4.8
6 8 10 12 14 16 18 20 24 28 32 36 40 44 48
', header = TRUE, na.string='NA', stringsAsFactors=FALSE)
desired.result
# reshape data to form two columns
new.data <- reshape(my.data, direction="long",
varying = list(seq(1,(ncol(my.data)-1),1), seq(2,(ncol(my.data)-0),1)),
v.names=c("v1", "v2"))
# interpolate every row
interpol <- t(apply(new.data[,2:3], 1, function(x) approx(x, n = 6)$y))
new.data2 <- data.frame(time = new.data$time, interpol, id = new.data$id)
# reform row:column structure
my.data2 <- reshape(new.data2, idvar="id", timevar = "time", direction = "wide")
# middle columns are repeated and must be removed
my.data3 <- my.data2[, !names(my.data2) %in% c("X1.2")]
my.data3
id X1.1 X2.1 X3.1 X4.1 X5.1 X6.1 X2.2 X3.2 X4.2 X5.2 X6.2
1.1 1 0.1 0.12 0.14 0.16 0.18 0.2 0.24 0.28 0.32 0.36 0.4
2.1 2 1.0 1.20 1.40 1.60 1.80 2.0 2.40 2.80 3.20 3.60 4.0
3.1 3 10.0 12.00 14.00 16.00 18.00 20.0 24.00 28.00 32.00 36.00 40.0
一种无效的插值替代方法:
sapply( seq(1, (ncol(my.data)-1), 1), function(i) {approx(c(my.data[,i], my.data[,i+1]), n = 6)$y } )
【问题讨论】:
标签: r interpolation extrapolation