在R中处理含UNDO/Clear命令的数据库表:排序与过滤方案
R语言处理含操作命令的序列数据
原始输入数据
| Sequence | Employ |
|---|---|
| 1-0 | Lucas |
| 1-1 | Juan |
| 2-1 | Martin |
| UNDO | |
| 1-2 | Pedro |
需求与解决方案
1. 过滤清除UNDO删除的序列
要得到如下目标表:
| Sequence | Employ |
|---|---|
| 1-0 | Lucas |
| 1-1 | Juan |
| 1-2 | Pedro |
采用栈结构模拟操作流程:遇到普通序列就入栈,遇到UNDO就弹出栈顶元素。用R代码实现(依赖dplyr和purrr):
library(dplyr) library(purrr) # 构造原始数据框 df <- tibble( Sequence = c("1-0", "1-1", "2-1", "UNDO", "1-2"), Employ = c("Lucas", "Juan", "Martin", "", "Pedro") ) # 模拟栈操作 process_stack <- function(df) { stack <- list() for (i in 1:nrow(df)) { row <- df[i, ] if (row$Sequence == "UNDO") { if (length(stack) > 0) { stack <- stack[-length(stack)] } } else { stack <- append(stack, list(row)) } } bind_rows(stack) } # 生成结果 result1 <- process_stack(df) print(result1)
2. 替换最后一条记录为Martin时的处理
如果原始数据最后一行是1-2 | Martin,只需修改对应值后复用栈处理函数,即可得到目标表:
# 修改后的原始数据 df_modified <- tibble( Sequence = c("1-0", "1-1", "2-1", "UNDO", "1-2"), Employ = c("Lucas", "Juan", "Martin", "", "Martin") ) # 生成结果 result2 <- process_stack(df_modified) print(result2)
3. 识别序列间的操作命令(Undo/Clear)
无需访问原始数据库,可通过序列层级变化和前后有效序列关联性判断:
- Undo识别:当前有效序列的前缀(如
1-)与前一个被撤销的序列前缀不同(如之前是2-),且当前序列后缀(如2)是同前缀序列后缀的递增(如1-1之后是1-2),说明之前的序列被撤销。 - Clear识别:若序列突然跳转到低层级(如从
3-5直接回到1-0),或栈长度直接归零后重新开始,可判定为Clear操作。
也可通过栈长度变化辅助判断:Undo会让栈长度减1;Clear会让栈长度直接回到初始状态。
关于Order列尝试的问题
你之前的Order列方法存在缺陷:重复的Order值无法区分是"撤销回退"还是"新添加"的状态。而栈结构能精准追踪每一步操作后的有效序列,避免这种歧义。
内容的提问来源于stack exchange,提问作者Lucas Merolla
相关产品推荐
相关产品推荐

