为什么data.table的melt仅在多测量变量时返回数字索引
data.table::melt() 单测量变量返回列名而非数字索引的问题说明
原因
这个是data.table中melt()函数的默认设计逻辑:
- 当
measure参数传入的patterns()匹配到多组列时(即你传入多个正则表达式,分别匹配varA、varB两组列的场景),melt()会识别为多测量变量的长宽转换场景,此时variable列(你命名为index)会默认返回对应列组的整数序号,也就是你看到的1、2、3。 - 当
patterns()只匹配到单组列时,melt()会切换为普通单变量转换逻辑,直接将原始列名作为variable列的取值,所以你得到的是varA1、varA2这类原值。
解决方法
有两种常用的修改方案可以得到你要的数字索引:
方案1:手动提取索引值
跑完转换后用正则提取列名里的数字部分转成整数:
dt_long <- melt(dt, id.vars ="id", measure=patterns("^varA"), value.name = "varA",variable.name = "index") dt_long[, index := as.integer(sub("varA", "", index))]
方案2:强制触发多组转换逻辑
只要将measure参数的输入改为列表结构,哪怕只有一组匹配列,melt()也会按多组逻辑返回数字索引:
# 写法1:把patterns包在列表里 dt_long <- melt(dt, id.vars = "id", measure = list(patterns("^varA")), value.name = "varA", variable.name = "index") # 写法2:直接用grep返回的列索引包成列表 dt_long <- melt(dt, id.vars = "id", measure = list(grep("^varA", names(dt))), value.name = "varA", variable.name = "index")
内容的提问来源于stack exchange,提问作者Maor
相关产品推荐
相关产品推荐

