所有先前行的最接近值 r

closest value from all previous rows r

我有一个数据框,我想添加一个列来识别最接近相应列的值,仅忽略所有先前的值。

我找到了一个最接近的值函数,但不确定如何将其限制为仅前几行。在下面的例子中,我想找到最接近的 Revenue 值,只考虑前面的行。

set.seed(1)
df<-data.frame(id=c(1:20),Revenue=sample(20))

closest<-function(xv,sv){
  xv[which(abs(xv-sv)==min(abs(xv-sv)))] }

您可以使用 dist + apply

尝试下面的代码
transform(
  df,
  close_prev = Revenue[apply(`diag<-`(m <- as.matrix(dist(Revenue)), Inf) / upper.tri(m), 2, which.min)]
)

这给出了

   id Revenue close_prev
1   1       4          4
2   2       7          4
3   3       1          4
4   4       2          1
5   5      13          7
6   6      19         13
7   7      11         13
8   8      17         19
9   9      14         13
10 10       3          4
11 11      18         19
12 12       5          4
13 13       9          7
14 14      16         17
15 15       6          7
16 16      15         14
17 17      12         13
18 18      10         11
19 19      20         19
20 20       8          7

要为每个数字仅获取 1 个最接近的值,您可以使用 which.min 更改函数并使用以下内容。

library(dplyr)
library(purrr)

closest <- function(xv,sv) xv[which.min(abs(xv-sv))]

df %>%
  mutate(close_prev = map_dbl(row_number(), 
           ~closest(Revenue[seq_len(max(.x - 1, 1))], Revenue[.x])))

#   id Revenue close_prev
#1   1       4          4
#2   2       7          4
#3   3       1          4
#4   4       2          1
#5   5      13          7
#6   6      19         13
#7   7      11         13
#8   8      17         19
#9   9      14         13
#10 10       3          4
#11 11      18         19
#12 12       5          4
#13 13       9          7
#14 14      16         17
#15 15       6          7
#16 16      15         14
#17 17      12         13
#18 18      10         11
#19 19      20         19
#20 20       8          7

所有以前的值(.x - 1)每次都在closest函数中传递。 max(.x - 1, 1) 用于处理第一行,因为之前没有值。