data.table分组时如何保留原列名(含变量指定列名场景)
在data.table中分组时保留原列名的解决方案
直接使用列名分组(带函数处理)
当你需要对列应用factor()这类函数后再分组,同时保留原列名时,不要直接把函数写在by参数里,而是用命名列表的形式指定分组列名:
library(data.table) dt <- data.table(value=rnorm(100), class=sample(1:3, 100, replace=TRUE)) # 显式指定分组列名为原列名class dt[, .(class_mean=mean(value)), by=.(class = factor(class))]
这段代码的输出分组列名就是class,而非factor。
通过变量指定列名分组
当用变量存储列名时,有两种简洁的方式实现保留原列名的需求:
方法1:利用非标准求值!!配合:=
这是data.table推荐的写法,通过!!强制解析变量的实际值作为列名:
var_name <- "class" dt[, .(class_mean=mean(value)), by=.(!!var_name := factor(get(var_name)))]
方法2:用setNames构造命名列表
通过setNames给分组列指定原列名:
var_name <- "class" dt[, .(class_mean=mean(value)), by=setNames(list(factor(get(var_name))), var_name)]
两种方法都能让结果中的分组列名保持为class,而不是变量名var_name。
内容的提问来源于stack exchange,提问作者ReelSaemon
相关产品推荐
相关产品推荐

