R语言dataframe新增列:仅匹配当前行之前所有行的最接近值
R实现仅匹配历史行最接近值的方案
核心逻辑
你原来的closest函数可以直接复用,只需要在逐行计算时,把传入的查找范围限定为当前行索引之前的所有Revenue值即可,第一行因为没有前置行,默认填充NA。
基础R实现代码
set.seed(1) df<-data.frame(id=c(1:20),Revenue=sample(20)) closest<-function(xv,sv){ # 末尾加[1]是避免出现多个同样接近值时返回多个结果,可按需调整 xv[which(abs(xv-sv)==min(abs(xv-sv)))][1] } # 初始化新列 df$closest_prev_rev <- NA_real_ # 从第2行开始遍历计算 for (i in 2:nrow(df)) { # 查找范围限定为1到i-1行的Revenue,也就是当前行之前的所有行 df$closest_prev_rev[i] <- closest(df$Revenue[1:(i-1)], df$Revenue[i]) }
dplyr + purrr 风格实现(适配tidyverse语法习惯)
library(dplyr) library(purrr) 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)))][1] } df <- df %>% mutate( closest_prev_rev = imap_dbl(Revenue, function(val, idx) { if (idx == 1) return(NA_real_) closest(Revenue[1:(idx-1)], val) }) )
效果验证
输出前几行可验证逻辑正确性:
head(df) # id Revenue closest_prev_rev #1 1 6 NA #2 2 8 6 #3 3 11 8 #4 4 16 11 #5 5 4 6 #6 6 14 16
内容的提问来源于stack exchange,提问作者jsimpsno
相关产品推荐
相关产品推荐

