我有许多位置的时间序列数据数据框(行作为日期和列作为位置)。
Dates <- c(1950, 1960, 1970, 1980)
Well1 <- c(25, 30, 40, 28)
Well2 <- c(26, 29, 38, 25)
Well3 <- c(20, 25, 35, 19)
Inputs <- cbind.data.frame(Dates, Well1, Well2, Well3)
我有一个每个位置的新日期数据框。
Well1new <- c(1955, 1965, 1975, 1985)
Well2new <- Well1new + 1
Well3new <- Well2new + 1
NewDates <- cbind.data.frame(Well1new, Well2new, Well3new)
我需要根据每个输入日期和位置的插值插入每个位置的每个新日期并返回数据框。我可以一次轻松地计算出一个位置:
approx(Inputs$Dates, Inputs$Well1, NewDates$Well1new, rule = 2)$y
[1] 27.5 35.0 34.0 28.0
approx(Inputs$Dates, Inputs$Well2, NewDates$Well2new, rule = 2)$y
[1] 27.8 34.4 30.2 25.0
approx(Inputs$Dates, Inputs$Well3, NewDates$Well3new, rule = 2)$y
[1] 23.5 32.0 23.8 19.0
但实际上我会有数千个地点。我试图使用apply来循环NewDates中的列,但我不明白如何相应地索引Inputs列。我还想避免for循环,因为速度是一个问题(或者应用不比循环更快?)。
答案 0 :(得分:1)
利用Map
循环遍历两个对象。
Map(approx, xout=NewDates, x=Inputs["Dates"], y=Inputs[-1], rule=2)
输出:
#$Well1new
#$Well1new$x
#[1] 1955 1965 1975 1985
#
#$Well1new$y
#[1] 27.5 35.0 34.0 28.0
#...
答案 1 :(得分:0)
您可以使用lapply
执行所有井的计算,如下所示。 lapply
vs for
循环的表现是一场长时间的辩论,意见不一。我个人仍然希望在可行的情况下使用lapply
all.wells <- names(Inputs)[-1]
lapply(all.wells, function(x) {
approx(Inputs$Dates, Inputs[,x], NewDates[,paste0(x, "new")], rule = 2)$y
}
)