【问题标题】:Interpolate over each column in a data frame to new data and return a data frame r在数据框中的每一列上插入新数据并返回数据框 r
【发布时间】:2018-04-10 23:30:16
【问题描述】:

我有许多位置的时间序列数据数据框(行作为日期,列作为位置)。

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 循环,因为速度是一个问题(或者应用速度不比 for 循环快?)。

【问题讨论】:

  • cbind.data.frame 创建数据框?这是一个新的。
  • @RichScriven - 它可以工作并且不会强制输入,所以对我来说一切都很好:-)
  • 我猜。但是data.frame 也可以工作,而且少了 6 个字符 :)
  • 我不记得确切的问题,但我过去从 data.frame() 创建数据帧时遇到过问题
  • 其实我觉得是cbind()的问题,所以养成了使用cbind.data.frame()的习惯,不过还是了解一下data.frame()吧。

标签: r interpolation apply


【解决方案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
#...

【讨论】:

  • 效果很好,谢谢!作为后续,我将 Map() 函数的结果处理为 data.frame:data.frame(lapply(result, function(x){x$y}))
【解决方案2】:

您可以使用lapply 为您的所有孔执行计算,如下所示。 lapplyfor 循环的性能是一场长期争论,意见不一。我个人还是喜欢在可行的情况下使用lapply

all.wells <- names(Inputs)[-1]
lapply(all.wells, function(x) {
    approx(Inputs$Dates, Inputs[,x], NewDates[,paste0(x, "new")], rule = 2)$y
  }
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多