使用data.table::melt时如何保留变量原始层级名称?
保留data.table melt转换后变量的原始层级名称
我太懂这种手动改因子层级的痛苦了——层级多的时候不仅费时间,还容易出错。其实咱们完全可以从原始宽格式数据的列名里自动提取需要的层级名称,完美解决这个问题,不用手动敲一个一个名称!
解决方案思路
原始数据的列名有统一规律:a_alpha、a_beta、a_gamma这类列的前缀是固定的a_,后面跟着的就是咱们想要的层级名称。只要把这些后缀提取出来,直接赋值给转换后item列的因子层级就行。
具体操作步骤
1. 从原始列名中提取目标层级名称
先筛选出所有以a_开头的列(因为这类列的后缀正好对应我们需要的层级),再用字符串处理去掉前缀a_:
# 获取所有以a_开头的列名 target_cols <- grep("^a_", names(df), value = TRUE) # 提取后缀作为层级名称 item_levels <- sub("^a_", "", target_cols)
2. 给转换后的item列设置新层级
直接把提取到的层级名称赋值给df_long$item的levels参数:
levels(df_long$item) <- item_levels
3. 验证结果
现在再查看item列的层级,就变成咱们想要的名称了:
levels(df_long$item) #> [1] "alpha" "beta" "gamma"
完整整合代码
把整个流程串起来的完整代码如下:
library(data.table) set.seed(2334) # 构建宽格式数据 df <- as.data.frame( cbind( a_alpha = rnorm(10), a_beta = rnorm(10), a_gamma = rnorm(10), b_alpha = rnorm(10), b_beta = rnorm(10), b_gamma = rnorm(10), id = c(1:10) ) ) # 转换为长格式 df_long <- data.table::melt( data.table::setDT(df), measure = patterns("^a_", "^b_"), value.name = c("a", "b"), variable.name = "item" ) # 自动提取并设置层级名称 target_cols <- grep("^a_", names(df), value = TRUE) item_levels <- sub("^a_", "", target_cols) levels(df_long$item) <- item_levels # 查看结果 str(df_long) levels(df_long$item)
这种方法完全适配任意数量的层级,只要列名前缀统一,就能自动完成提取和赋值,既高效又不会出错!
内容的提问来源于stack exchange,提问作者Indrajeet Patil
相关产品推荐
相关产品推荐

