R语言data.table场景下如何提取join操作on参数表达式的左右侧内容
data.table的on参数左右侧提取函数实现
需求说明
在data.table连接操作场景中,on参数支持多种合法传入格式,常见形式如下:
- 无命名字符向量:例如
c("date == Date", "id"),元素可以是带比较运算符的表达式,也可以是单个列名(代表左右表列名一致) - 命名字符向量:例如
c(date = "Date", "id"),命名位置的键名代表左表列,值代表右表列
我们需要实现两个工具函数lhs()和rhs(),分别提取on参数中对应左表、右表的列名,符合以下示例效果:
lhs(c("date == Date", "id"))返回c("date", "id")rhs(c("date <= Date", "id == ID"))返回c("Date", "ID")lhs(c(date = "Date", "id"))返回c("date", "id")
函数实现
# 提取左表列名 lhs <- function(on) { nms <- names(on) res <- character(length(on)) # 处理带命名的元素,直接取名称作为左表列 named_idx <- !is.null(nms) & nms != "" res[named_idx] <- nms[named_idx] # 处理未命名元素,拆分运算符取左侧 unamed_ele <- on[!named_idx] op_pat <- "\\s*(==|>=|<=|<|>|%in%)\\s*" split_ele <- strsplit(unamed_ele, op_pat) res[!named_idx] <- vapply(split_ele, function(x) trimws(x[1]), FUN.VALUE = character(1)) unname(res) } # 提取右表列名 rhs <- function(on) { nms <- names(on) res <- character(length(on)) # 处理带命名的元素,直接取对应值作为右表列 named_idx <- !is.null(nms) & nms != "" res[named_idx] <- on[named_idx] # 处理未命名元素,拆分运算符取右侧 unamed_ele <- on[!named_idx] op_pat <- "\\s*(==|>=|<=|<|>|%in%)\\s*" split_ele <- strsplit(unamed_ele, op_pat) res[!named_idx] <- vapply(split_ele, function(x) trimws(x[length(x)]), FUN.VALUE = character(1)) unname(res) }
效果验证
# 测试1:无命名混合表达式和单列名 lhs(c("date == Date", "id")) # 输出:"date" "id" # 测试2:无命名全表达式 rhs(c("date <= Date", "id == ID")) # 输出:"Date" "ID" # 测试3:混合命名和无命名元素 lhs(c(date = "Date", "id")) # 输出:"date" "id"
内容的提问来源于stack exchange,提问作者statquant
相关产品推荐
相关产品推荐

