如何自动提取表头后缀,实现data.table按模式melt后的变量值自动赋值?
自动化data.table melt后child列的命名替换
问题场景
在使用data.table的melt函数重塑数据时,针对前缀统一(如child_、dob_)的多组列,默认生成的child列会用数字1、2、3...标识分组,需要手动替换为原列名的后缀(如boy、girl、trans)。当存在数十组此类列时,手动替换极易出错,需实现自动化处理。
原始示例代码
library(data.table) DT <- data.table( parent.name = words[101:103], parent.dob = as.Date(1:3, origin="2020-01-01"), child_boy = words[11:13], child_girl = words[21:23], child_trans = words[201:203], dob_boy= as.Date(1:3, origin="2010-01-01"), dob_girk= as.Date(1:3, origin="2012-01-01"), dob_trans= as.Date(1:3, origin="2022-01-01") ) # 原始melt操作 DT2 <- melt(DT, id.vars = c("parent.name", "parent.dob"), measure=patterns(dob="^dob_", name="^child_"), value.factor=TRUE, variable.name = "child") # 手动替换的原始操作 DT2 [child=="1", child:="boy"] [child=="2", child:="girl"][child=="3", child:="trans"]
自动化解决方案
方法1:提取原列后缀替换因子水平
利用正则提取原数据中child_前缀列的后缀,直接替换melt后child列的因子水平,无需手动匹配数字:
# 提取child_开头列的后缀,作为分组标签 child_labels <- sub("^child_", "", grep("^child_", colnames(DT), value = TRUE)) # 执行melt DT2 <- melt(DT, id.vars = c("parent.name", "parent.dob"), measure=patterns(dob="^dob_", name="^child_"), value.factor=TRUE, variable.name = "child") # 替换child列的因子水平 levels(DT2$child) <- child_labels
方法2:提取所有相关列后缀统一映射
如果需要确保dob_和child_列的后缀完全对应,可提取所有目标列的后缀去重后映射:
# 提取所有带child_/dob_前缀列的后缀,去重后得到分组标签 child_types <- unique(sub("^(child|dob)_", "", grep("^(child|dob)_", colnames(DT), value = TRUE))) # 执行melt DT2 <- melt(DT, id.vars = c("parent.name", "parent.dob"), measure=patterns(dob="^dob_", name="^child_"), value.factor=TRUE, variable.name = "child") # 将数字标识替换为对应标签 DT2[, child := factor(child, levels = seq_along(child_types), labels = child_types)]
验证结果
执行上述自动化代码后,DT2的child列会自动显示为boy、girl、trans,与手动替换的结果完全一致,且无需关注分组数字与标签的对应关系,避免了手动操作的错误。
内容的提问来源于stack exchange,提问作者IVIM
相关产品推荐
相关产品推荐

