【问题标题】:Create a function from a vector to another创建一个从一个向量到另一个向量的函数
【发布时间】:2016-08-18 13:16:58
【问题描述】:

我有两个向量:

x <- c(-2.0,-1.75,-1.50,-1.25,-1.00,-0.75,-0.50,-0.25,0.00,0.25,0.50,0.75,1.00,1.25,1.50,1.75,2.00,2.25,2.50,2.75)
y <- c(37.0000,24.1602,15.06250,8.91016,5.00000,2.72266,1.56250,1.09766,1.00000,1.03516,1.06250,1.03516,1.00000,1.09766,1.56250,2.72266,5.00000,8.91016,15.06250,24.16016)

我正在尝试创建一个从向量 x 给定数字的函数,它返回相应的 y 值(相同的索引)。例如,func(-2.0) 应该返回 37.0000

目前我有这个超级丑陋的功能,我认为这不是我应该做的:

func1 <- function(x) {
  if (x==-2.0) {return (37.0000)}
  else if (x==-1.75){return (24.1602)}
  else if (x==-1.50){return (15.06250)}
  else if (x==-1.25){return (8.91016)}
  else if (x==-1.00){return (5.00000)}
  else if (x==-0.75){return (2.72266)}
  else if (x==-0.50){return (1.56250)}
  else if (x==-0.25){return (1.09766)}
  else if (x==0.00){return (1.00000)}
  else if (x==0.25){return (1.03516)}
  else if (x==0.50){return (1.06250)}
  else if (x==0.75){return (1.03516)}
  else if (x==1.00){return (1.00000)}
  else if (x==1.25){return (1.09766)}
  else if (x==1.50){return (1.56250)}
  else if (x==1.75){return (2.72266)}
  else if (x==2.00){return (5.00000)}
  else if (x==2.25){return (8.91016)}
  else if (x==2.50){return (15.06250)}
  else if (x==2.75){return (24.16016)}
  else {return (Inf)}
}

【问题讨论】:

  • 不需要函数,y[ which(x == -2.0) ]

标签: r function vector


【解决方案1】:

您似乎在进行插值。插值的R函数是approx()

approx(x, y, xout = -2)

$x
[1] -2

$y
[1] 37

实际上,使用approxfun() 创建插值函数更容易。试试这个:

foo <- approxfun(x, y)
foo(-2)
[1] 37

您应该避免使用==match() 的精确匹配策略。原因很简单——如果你使用计算值来查找索引位置,你会发现匹配不准确。

比较:

y[ which(x == -2.0) ]
[1] 37

y[ which(x == -2.00000000001) ]
numeric(0)

同样:

y[match(-2.0, x)]
[1] 37

y[match(-2.0000000000001, x)]
[1] NA

【讨论】:

  • approxfun 是我几分钟前的提议......它还需要 yright 和 yleft 选项来处理 OP 要求......这只是一个“替代解决方案”,也许 OP 真的想要 Inf 在“漏洞”中x.
【解决方案2】:

精确匹配:

foo = function(u) {res=y[pmatch(u,x)];ifelse(is.na(res), Inf, res)}
#> foo(-2)
#[1] 37
#> foo(-1.8)
#[1] Inf
#> foo(-4)
#[1] Inf

不确定您需要什么,但请注意您可以使用线性插值(您可以将方法设为常量而不是线性):

foo = approxfun(x,y, yleft=Inf, yright=Inf)
#> foo(-2)
#[1] 37
#> foo(-1.8)
#[1] 26.72816
#> foo(-4)
#[1] Inf

在最后一种情况下,值不是由x 定义的边界域中的 Inf。

【讨论】:

  • 添加处理else {return (Inf)}的选项
【解决方案3】:

你真的不需要这个函数,我建议你只使用:

y[x == -1.75]

x == -1.75 返回一个布尔向量,因此它将为 y 选择正确的值。

如果你真的想要一个函数:

f <- function(x,y,xi){
return(y[x == xi])
}

【讨论】:

  • which() 效率更高。
【解决方案4】:

由于x和y的长度相同,所以把x作为y的名字

names(y)<-x
y

      -2    -1.75     -1.5    -1.25       -1    -0.75     -0.5    -0.25        0     0.25      0.5     0.75        1     1.25      1.5     1.75        2 
37.00000 24.16020 15.06250  8.91016  5.00000  2.72266  1.56250  1.09766  1.00000  1.03516  1.06250  1.03516  1.00000  1.09766  1.56250  2.72266  5.00000 
    2.25      2.5     2.75 
 8.91016 15.06250 24.16016 

这样,您可以按名称调用,例如

y["-2"]

-2 
37

y["-1.75"]

-1.75 
24.1602 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 2011-08-13
    • 2021-12-06
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    相关资源
    最近更新 更多