在R语言中使用approx()对列表中的值进行插值的方法
列表数据插值的解决方法
approx()函数只接受向量类型的x和y参数,直接传列表肯定报错。你有两组(x,y)配对数据(列表里的每个元素是一组),可以用多参数遍历函数分别处理每组数据,下面给两种实用方法:
基础R解法(无需额外包)
用mapply()来配对遍历x和y的对应元素,对每组分别执行插值:
x <- list(c(20, 25), c(24, 25)) y <- list(c(0.98, 0.96), c(0.94, 0.96)) xout <- c(23.1, 24, 1) # 对每组(xi,yi)做插值,提取y的结果 interp_result <- mapply(function(xi, yi) approx(xi, yi, xout = xout)$y, x, y)
运行后interp_result是一个矩阵,每一列对应一组数据的插值结果:
[,1] [,2] [1,] 0.964 NA [2,] 0.968 0.94 [3,] NA NA
允许外插(处理超出x范围的xout值)
如果想对xout中超出原x范围的数值(比如例子里的1)做外插,加上rule=2参数,会用端点值填充:
interp_result <- mapply(function(xi, yi) approx(xi, yi, xout = xout, rule = 2)$y, x, y)
结果会变成:
[,1] [,2] [1] 0.964 0.94 [2] 0.968 0.94 [3] 0.980 0.94
tidyverse风格解法(用purrr包)
如果你习惯用tidyverse工具,可以用purrr::map2(),返回和输入结构一致的列表:
library(purrr) interp_result <- map2(x, y, ~approx(.x, .y, xout = xout, rule = 2)$y)
结果是列表,每个元素对应一组的插值向量:
[[1]] [1] 0.964 0.968 0.980 [[2]] [1] 0.94 0.94 0.94
注:你之前用apply()失败是因为它只处理数组/矩阵的维度遍历,不适合这种多列表的配对操作,mapply()或map2()才是对应场景的工具。
内容的提问来源于stack exchange,提问作者Tamara Vaz
相关产品推荐
相关产品推荐

