2017-02-17 28 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 
相关问题