【问题标题】:Map a function over a vector在向量上映射函数
【发布时间】:2018-09-11 16:57:41
【问题描述】:

我有以下xy

set.seed(1234)
x <- seq(1, 1000, 1)
y <- rnorm(1000)

我需要使用smooth.spline 对它们进行建模:

model <- smooth.spline(x, y, nknots = 10)

问题是我每次都需要修改nknots来适应这个模型。表示节点的向量如下:

myknots <- seq(5, 15, 1)

我想创建自己的函数,例如:

myfoo <- function(x, y, nknots){
  smooth.spline(x, y, nknots = nknots)
}

但我找不到直接的方法。我宁愿使用purrr 包。有什么想法吗?

【问题讨论】:

  • 你可以做lapply(myknots, function(k) myfoo(x=x,y=x,nknots=k))
  • 您的功能 myfoo 没有帮助。你可以做lapply(myknots, function(k){smooth.spline(x=x,y=y,nknots=k)})

标签: r dplyr tidyverse purrr


【解决方案1】:

您可以做到这一点,而无需额外的加载额外包的负担,并依赖它们在单行中使用 base::Vectorize 永远不会改变:

> alls = Vectorize(smooth.spline,"nknots",SIMPLIFY=FALSE)(x=x,y=y,nknots=myknots)

这将返回一个列表,其中每个元素都是smooth.spline 的每个myknots 值的输出:

> alls[[1]]
Call:
(function (x, y = NULL, w = NULL, df, spar = NULL, lambda = NULL, 
    cv = FALSE, all.knots = FALSE, nknots = .nknots.smspl, keep.data = TRUE, 
  ...

Smoothing Parameter  spar= 0.1318881  lambda= 0.01540768 (14 iterations)
Equivalent Degrees of Freedom (Df): 5.244268
Penalized Criterion (RSS): 984.4824
GCV: 0.99489
> alls[[2]]
Call:
(function (x, y = NULL, w = NULL, df, spar = NULL, lambda = NULL, 
    cv = FALSE, all.knots = FALSE, nknots = .nknots.smspl, keep.data = TRUE, 
  ...

Smoothing Parameter  spar= 0.2285265  lambda= 0.03658625 (12 iterations)
Equivalent Degrees of Freedom (Df): 5.006371
Penalized Criterion (RSS): 984.8108
GCV: 0.994746

将依赖关系保持在最低限度是一种很好的做法。

【讨论】:

    【解决方案2】:

    对于purrr,我们使用map

    library(purrr)
    map(myknots,  ~ myfoo(x, y, nknots = .x))
    

    【讨论】:

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