所有先前行的最接近值 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)
用于处理第一行,因为之前没有值。
我有一个数据框,我想添加一个列来识别最接近相应列的值,仅忽略所有先前的值。
我找到了一个最接近的值函数,但不确定如何将其限制为仅前几行。在下面的例子中,我想找到最接近的 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)
用于处理第一行,因为之前没有值。