2017-02-17 48 views
1

假設我有數據幀如下之間的最小差,查找數據幀列和R中的矢量

a = c(10,20,30,40,50, 60, 70, 80 ,90, 100) %>% data.frame() 
colnames(a) = c("column1") 

和向量​​,

b = c(46, 90, 75, 15) 

我想找到B的距離最近的元件一個。所需的輸出會是這樣,

a  b 
10 15 
20 15 
30 15 
40 46 
50 46 
60 46 
70 75 
80 75 
90 90 
100 90 

以下是我的努力,

我試圖rownames添加到A和B,努力創建完整加入,並找到對每個組合的差異,採取最小差異。但是加入rownames,只能使前四個元素全部加入,

a %>% add_rownames('rowname') %>% full_join(b %>% add_rownames(rowname), by = c("rowname" = "rowname")) 

這是行不通的。任何人都可以幫助我解決這個問題嗎?

+2

'一個$ B < - B [max.col(-abs(外(一個$列1,B,\' - \')))] ' – alistaire

+1

或dplyr,因爲它被標記爲'a%>%rowwise()%>%mutate(b = b [which.min(abs(column1 - b))]])' – alistaire

+0

@alistaire謝謝。你想發佈它作爲答案嗎? – Observer

回答

1

一種選擇是使用outer-從每個向量中減去所有元素組合,產生一個矩陣。重新排列以查找該矩陣的負絕對值,可以使用max.col來查找哪個索引b具有最小差異。子集b返回值,所以

a$b <- b[max.col(-abs(outer(a$column1, b, `-`)))] 

回報

a 
## column1 b 
## 1  10 15 
## 2  20 15 
## 3  30 15 
## 4  40 46 
## 5  50 46 
## 6  60 46 
## 7  70 75 
## 8  80 75 
## 9  90 90 
## 10  100 90 

你同樣可以工作元素,明智的,如果你喜歡。在dplyr,分組rowwise使得這種方法非常簡單:

library(dplyr) 

a %>% rowwise() %>% mutate(b = b[which.min(abs(column1 - b))]) 

## Source: local data frame [10 x 2] 
## Groups: <by row> 
## 
## # A tibble: 10 × 2 
## column1  b 
##  <dbl> <dbl> 
## 1  10 15 
## 2  20 15 
## 3  30 15 
## 4  40 46 
## 5  50 46 
## 6  60 46 
## 7  70 75 
## 8  80 75 
## 9  90 90 
## 10  100 90