2015-12-17 105 views
2

我輸入:如何找到與您的輸入最接近的值?

Tin=7.02654 ; t=0.1 ;Tou=?;sed=? 

我的問題是如何找到在sed sed[i]=價值,這將使Tou其中有錫或壽最接近我的天換句話說,至少區別?

我試了一下:

sed = seq(from = 0, to = 0.7, by=0.001) 
for(i in 1:length(sed)) { 
    Tou = 5 + t*sed[i] 
    find sed[i] = min(abs(Tou-Tin))) 
    sed[i] 
} 

我768,16放find sed[i]呢?

+3

請閱讀有關的信息[如何提出一個很好的問題(http://stackoverflow.com/help/how-to-ask),以及如何給予[重複的例子(HTTP:// stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610)。這會讓其他人更容易幫助你。 – Jaap

+0

我也會提供這個建議:'which(abs(x-your.number)== min(abs(x-your.number)))'from [here](https://stat.ethz.ch/pipermail /r-help/2008-July/167216.html)。 – Konrad

+0

@Konrad或者,可以使用'which.min(abs(x-your.number))'產生相同的索引(如果不存在關係)。 –

回答

3

您正在尋找的which.min功能,給出對應於給定的矢量最少值的索引。見?which.min。因此,這樣的事情應該給你想要的東西:

Tin <- 5.04 
t <- 0.1 
sed <- seq(from = 0, to = 0.7, by = 0.001) 

i <- which.min(abs(5 + t*sed - Tin)) 
#[1] 401 

sed[i] 
#[1] 0.4 

除非我誤解你的僞代碼,似乎沒有理由使用一個for循環。

編輯2: 要回答評論;這大概應該是這樣的

fun <- function(x, d, sed) { # Some complicated function 
    return(x*sed^2 + d) 
} 

myfun <-function(Tin) { 
    sed <- seq(from = 0, to = 0.7, by = 0.001) 
    Tou_vec <- fun(x = 1, d = 2, sed = sed) + 5 
    i <- which.min(abs(Tou_vec - Tin)) 
    return(sed[i]) 
} 

myfun(Tin = 5.5) 
#[1] 0 

功能which.min預期值的numeric向量,並返回值最小的索引。在你的代碼中,你提供了一個長度爲1的矢量,因此i總是評估爲1。此外,您還嘗試返回(或至少打印)for -loop內的(第一個)值。這是行不通的,如果您堅持,則需要明確的printreturn。我試圖在答案中重寫你的myfun。從您的示例中,您不需要for -loop。

+1

@temor這是不對的。我編輯了我的答案。 –

+1

你設置了't = sed [b] + 0.2',然後在添加'5'後加上'Tou'。 't'無處可用。這意味着你可以將'Tou'直接作爲'sed [b] + 5.2'。現在,你爲每個「b」做這個。因此,你可以將它作爲一個矢量來使用,只需要創建一個'Tou's矢量:即'Tou_vec < - sed + 5.2'(它將5.2的每個元素加入到'sed'的每個元素中)。所以你的't'和'Tou'變量有點多餘。 –

+1

@temor什麼是'x'和'd'在這裏?如果它們是常量w.r.t'b',那麼'fun'就被簡單地應用到'sed'中的每個元素,之後添加5,代碼可以是矢量化的,並且不需要for循環(「b」只不過是索引上的簿記)。我再次編輯了答案。否則,你應該更新你的問題(或者創建一個新的),以便你更好地解釋這個問題。 –

1

只要您發現Tou與Tin的絕對差異更小,您就可以記住最佳結果並更新它。就像這樣:

Tin = 5.04 
t = 0.1 

sed = seq(from = 0, to = 0.7, by = 0.001) 

bestResult = 5 + t * sed[1] 
bestDiff = abs(Tin - bestResult) 

for (i in 2:length(sed)) { 
    Tou = 5 + t * sed[i] 
    diff = abs(Tin - Tou) 
    if (diff < bestDiff) { 
    bestDiff = diff 
    bestResult = Tou 
    } 
} 

bestResult 
+0

謝謝。我需要從'sed'返回給出最好結果'bebeResult'的值。任何想法? – temor

2

一個缺點的which.min的方法是,它返回一個數而不是布爾值的一個矢量在(可再使用&|用,並且因此可以是更復雜的過濾器的一部分)

如果你想使用Ardavel所說的絕對差異,但沒有理由將它作爲循環的一部分進行追蹤,這可以完全在data.frame或data.table中完成。

Tin=7.02654 
t = 0.1 
test <- data.frame(sed = seq(from = 0, to = 0.7, by=0.001)) 
test$Tou <- 5 + t * test$sed 
test$sed[abs(test$Tou - Tin) == min(abs(test$Tou - Tin))] 
+0

謝謝。你對這個函數有什麼看法:'myfun <-function(Tin){sed < - seq(from = 0,to = 0.7,by = 0.001); for(b in 1:length(sed)){t = sed [b] +0.2;頭= 5 +噸;我< - which.min(abs(Tou - Tin)); SED [I]; }}'你可以根據這個功能更新你的答案嗎? – temor