使用R data.table编写函数报错:object 'Year' not found
解决data.table函数中分组列引用错误的问题
你遇到的问题源于data.table的非标准求值机制:直接在函数里写by = .(groupby_col)时,它会把groupby_col当作列名去查找,而非你传入的Year变量。以下是几种可行的解决方法:
方法1:使用非标准求值(NSE),支持裸变量名传入
借助rlang包的enquo和!!操作符,捕获传入的变量名并在data.table中展开:
library(data.table) library(rlang) counts_func <- function(df, groupby_col) { # 捕获传入的变量表达式 grp_col <- enquo(groupby_col) cnts <- df[, .(counts = uniqueN(Col_A)), by = !!grp_col] return(cnts) } # 调用时直接传裸列名 countbyYr <- counts_func(data, Year)
方法2:传入字符串列名,配合get()或.data代词
如果习惯传字符串形式的列名,可以用get()获取列,或者用.data代词更清晰:
用get()的写法
library(data.table) counts_func <- function(df, groupby_col) { cnts <- df[, .(counts = uniqueN(Col_A)), by = .(get(groupby_col))] # 给分组列重命名为原列名,避免默认的"get(groupby_col)" setnames(cnts, "get(groupby_col)", groupby_col) return(cnts) } # 调用时传字符串列名 countbyYr <- counts_func(data, "Year")
用.data代词的写法(推荐)
library(data.table) counts_func <- function(df, groupby_col) { cnts <- df[, .(counts = uniqueN(Col_A)), by = .(.data[[groupby_col]])] setnames(cnts, ".data[[groupby_col]]", groupby_col) return(cnts) } countbyYr <- counts_func(data, "Year")
方法3:用base R的substitute,无需额外包
如果不想依赖rlang,可以用substitute捕获变量名:
library(data.table) counts_func <- function(df, groupby_col) { grp_col <- substitute(groupby_col) cnts <- df[, .(counts = uniqueN(Col_A)), by = grp_col] return(cnts) } countbyYr <- counts_func(data, Year)
内容的提问来源于stack exchange,提问作者Jiamei
相关产品推荐
相关产品推荐

