2016-04-25 88 views
1

我有兩個載體:創建從一個矢量的功能到另一個

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)} 
} 
+3

無需功能,'Y [其中(X == -2.0)]'。 – zx8754

回答

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 

In這最後一種情況下,該值不是由x定義的邊界域中的Inf。

+0

添加選項來處理'else {return(Inf)}' – zx8754

0

由於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 
+0

考慮到這一點,'myInput < - -2; y [as.character(myInput)]'... – zx8754

0

你並不真的需要這個功能,我建議你只需使用:

y[x == -1.75] 

X == -1.75返回一個布爾值向量,因此會選擇Y的正確的價值。

如果你真的想要一個功能:

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

'哪()'更有效率。 – zx8754

2

你似乎在做插值。用於插值的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 
+1

approxfun是我的建議分鐘前...它需要yright和yleft選項而且處理OP要求...而且這只是一種'替代解決方案',也許OP希望在'x'的'洞'中真正使用Inf。 –