2017-11-25 15 views
1

私は2つのベクトルを持っていますが、ベクトルbのどの値がaの各要素の合計(a-b)を最小にするかを見たいと思います。私が望む出力は、ベクトルbの値を含む長さaのベクトルです。2つのベクトルの各要素を引く最小値を見つける

a <- c(1, 3, 5, 7, 9, 12, 19, 25, 80) 
b <- c(2, 9, 8.4, 7, 66, 32, 19, 4) 

は、私が試してみました -

closest_longitude <- function (x, y) { 
which.min(x - y) 
} 

closest_value <- sapply(a, closest_longitude, b) 

が、結果は珍糞漢糞です。

+0

であるあなたは、 '合計(AB)'または単に ' – akrun

+0

ab'だけABを意味しなかったので、出力は値を含む、同じ長さのベクトルでなければなりませんb –

+0

おそらく 'which.min(abs(xy))' – akrun

答えて

1

我々はabsを使用しない場合、それは常に第五ので5

sapply(a, closest_longitude, b) 
#[1] 5 5 5 5 5 5 5 5 5 

なりますclosest_longitude

closest_longitude <- function (x, y) { 
     which.min(abs(x - y)) 
} 

sapply(a, closest_longitude, b) 
#[1] 1 1 8 4 2 2 7 7 5 

機能でここabsを検討する必要があります'b'の要素は66で、 'a'の各要素を減算してその値を選択すると、負の値が最も小さくなります。ここで

+1

ありがとうございました、それを解決しました。 –

0

は「ブルートフォース」アルゴリズム

# 1. Vectors 
a <- c(1, 3, 5, 7, 9, 12, 19, 25, 80) 
b <- c(2, 9, 8.4, 7, 66, 32, 19, 4) 
# 2. Init settings 
sum_a_i_b_i_min <- Inf 
a_i_min <- 0 
b_i_min <- 0 

# 3. Calculations 
for(a_i in a){ 
    for(b_i in b){ 
    if(sum(a_i - b_i) < sum_a_i_b_i_min){ 
     sum_a_i_b_i_min <- sum(a_i - b_i) 
     a_i_min <- a_i 
     b_i_min <- b_i 
    } 
    print(paste0(a_i, " : ", b_i, " : ", sum(a_i - b_i))) 
    } 
} 
# 4. Result 
print(paste0("a_i_min = ", a_i_min, "/b_i_min = ", b_i_min, 
     "/sum(a_i_min - b_i_min) = ", sum_a_i_b_i_min)) 
関連する問題