假设我有如下数据框,
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"))
这不起作用。有人可以帮我解决这个问题吗?
答案 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