编写接收data.table列名作为参数的简易函数的方法对比
data.table函数实现疑问与最佳实践探讨
需求背景
我是data.table新手,需要实现以下需求:
- 编写可接收多个字符串形式列名作为参数的函数,而非直接传入列对象;
- 函数需基于这些列执行多种数据操作(如创建新变量、编辑列等);
- 仅作为数据清洗流程的一部分,无需复杂实现。
我已找到三种可行实现方法,现存在两个疑问:
- data.table官方文档推荐使用
env()而非get(),但测试发现get()方法简洁有效,从性能或编码效率角度,优先选择env()的原因是什么? - 方法3(创建临时克隆列)除了创建额外列带来的时间与内存消耗外,在性能或编码效率方面还有其他缺点吗?
三种实现方法
方法1:使用get()引用变量
library(data.table) fun_get <- function(dt, col_var, group_var) { max_name <- paste0(col_var, "_max") dt[, (max_name) := max(get(col_var)), by = get(group_var)] # 此处可添加更多涉及col_var和group_var的操作 }
方法2:使用env()引用变量
fun_env <- function(dt, col_var, group_var) { max_name <- paste0(col_var, "_max") dt[, (max_name) := max(col), by = grp, env = list( col = as.name(col_var), grp = as.name(group_var) )] # 此处可添加更多涉及col_var和group_var的操作 }
方法3:生成可直接引用的临时变量
该示例虽繁琐,但后续对col_var和group_var的操作会更简便
fun_temp <- function(dt, col_var, group_var) { dt[, `:=`( col_temp = get(col_var), group_temp = get(group_var) )] max_name <- paste0(col_var, "_max") dt[, (max_name) := max(col_temp), by = group_temp] # 此处可添加更多涉及col_var和group_var的操作 dt[, c("col_temp", "group_temp") := NULL] }
测试示例
三种方法对data.table的修改效果一致,测试用data.table及方法1调用示例如下:
dt <- data.table( value = c(10, 20, 30, 40, 50), group = c("A", "A", "B", "B", "B") ) fun_get(dt, "value", "group")
内容的提问来源于stack exchange,提问作者ZyzotPerplex
相关产品推荐
相关产品推荐

