使用data.table函数的by参数传入多列时出现错误
解决data.table函数中传入多列分组的错误问题
错误原因
你遇到的错误是因为在by参数中使用list(bycol1, bycol2)时,传入的字符串列名被当成了长度为1的常量值,而非引用DT中对应的列,导致分组元素长度与DT行数不匹配。
修正方案
直接将字符向量传入by参数即可,data.table支持直接用字符向量指定分组列。同时可以简化j表达式里的计算逻辑(无需lapply,因为只针对ret列计算):
vw_testfunction <- function(bycol1, bycol2){ vwret_df <- DT[, .(vw_ret = sum(ret * mcap / sum(mcap, na.rm = TRUE), na.rm = TRUE)), by = c(bycol1, bycol2), .SDcols = "ret"] return(vwret_df) } test <- vw_testfunction("state", "datadate")
补充说明
by = c(bycol1, bycol2):data.table会自动识别字符向量中的元素为DT的列名,正确按列进行分组。- 简化计算逻辑:由于
.SDcols仅指定了ret,无需用lapply遍历.SD,直接在j表达式中使用ret和mcap列计算即可(mcap是DT的列,可直接调用)。 - 备选方案(不推荐,仅作参考):若坚持用
list形式,可通过get()函数引用列:
by = list(get(bycol1), get(bycol2))
但这种写法不如直接传字符向量简洁直观。
内容的提问来源于stack exchange,提问作者PolarVibes
相关产品推荐
相关产品推荐

