如何在data.table中按名称含逗号的列分组
解决data.table按含逗号列名分组的问题
当data.table的列名包含逗号时,直接传递多元素字符向量给by参数会触发解析错误——因为data.table会把逗号当作列名的分隔符,而非列名的一部分。以下是几种优雅的解决方式:
方法1:直接用反引号引用列名
如果分组列是固定的,直接用反引号包裹含逗号的列名,放入list中即可:
dt[, mean(x), by = list(`a,b`, `c,d`)]
方法2:动态处理变量中的列名
如果分组列名存在变量(比如groupByColumns),可以通过动态生成表达式的方式实现:
groupByColumns <- c("a,b", "c,d") # 生成带反引号的列名表达式,再解析执行 by_expr <- parse(text = paste0("list(", paste(sprintf("`%s`", groupByColumns), collapse = ","), ")")) dt[, mean(x), by = eval(by_expr)]
方法3:合并为单个带引号的字符串
把每个含逗号的列名用双引号包裹,合并成单个字符串传递给by:
# 硬编码写法 dt[, mean(x), by = '"a,b","c,d"'] # 变量处理写法 by_str <- paste(sprintf('"%s"', groupByColumns), collapse = ",") dt[, mean(x), by = by_str]
验证示例
运行以下可重现代码,三种方法都会得到正确的分组均值结果:
library(data.table) set.seed(123) dt <- data.table(x=rnorm(10), y=c(1,2,3,1,2,3,1,2,3,1), z=c(1,1,1,1,1,2,2,2,2,2)) names(dt) <- c("x", "a,b", "c,d") # 方法1 dt[, mean(x), by = list(`a,b`, `c,d`)] # 方法2 groupByColumns <- c("a,b", "c,d") by_expr <- parse(text = paste0("list(", paste(sprintf("`%s`", groupByColumns), collapse = ","), ")")) dt[, mean(x), by = eval(by_expr)] # 方法3 by_str <- paste(sprintf('"%s"', groupByColumns), collapse = ",") dt[, mean(x), by = by_str]
输出结果:
a,b c,d V1 1: 1 1 -0.2301775 2: 2 1 1.5587083 3: 3 1 0.0705084 4: 1 2 0.1292877 5: 2 2 1.7150650 6: 3 2 0.4609162
内容的提问来源于stack exchange,提问作者Noskario
相关产品推荐
相关产品推荐

