找出dataframe列和R中的向量之间的最小差异

时间:2017-02-17 22:56:04

标签: r dplyr

假设我有如下数据框,

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

和一个矢量,

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

我想从a找到b中最接近的元素。所需的输出是,

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

以下是我的尝试,

我正在尝试为a和b添加rownames并尝试创建完整联接,并找到每个组合的差异并采取最小差异。但是添加rownames会使完整联接仅适用于前四个元素,

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

这不起作用。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分: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