如何查找当前行上方level值小1的最近行的id?
查找当前行之前最近的level小1的行ID的解决方案
需求:为数据框每行找到当前行之前最近的、level值比当前行小1的行的id,示例数据如下:
id <- c(42,53,82,17,33,92,6,12,66) level <- c(2,3,3,3,3,4,3,3,4) df <- tibble(id,level)
原始数据输出:
id level 1 42 2 2 53 3 3 82 3 4 17 3 5 33 3 6 92 4 7 6 3 8 12 3 9 66 4
期望得到的结果:
id level results 1 42 2 NA 2 53 3 42 3 82 3 42 4 17 3 42 5 33 3 42 6 92 4 33 7 6 3 42 8 12 3 42 9 66 4 12
解决方案代码
使用dplyr结合purrr实现逐行逻辑判断:
library(dplyr) library(purrr) df %>% mutate(results = map_dbl(row_number(), ~{ current_level <- level[.] prev_rows <- slice(df, 1:(.x - 1)) target_rows <- prev_rows %>% filter(level == current_level - 1) if (nrow(target_rows) > 0) last(target_rows$id) else NA_real_ }))
代码说明
row_number()获取每行的行号,map_dbl遍历每个行号执行自定义逻辑- 对每行,先提取当前行的
level值,再筛选出当前行之前的所有行 - 在历史行中筛选出
level等于当前行level-1的记录 - 如果存在符合条件的记录,取最后一条(即最近的)的
id;否则返回NA
内容的提问来源于stack exchange,提问作者Mark H.
相关产品推荐
相关产品推荐

