You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用data.table的melt实现tidyr::pivot_longer的多名称模式拆分?

使用data.table实现tidyr::pivot_longer的变量名拆分功能

你可以通过先melt转长表,再拆分变量名列的方式实现等价功能,具体代码如下:

library(data.table)

# 构造示例数据
dt <- data.table(id = 1:5, abc_123 = runif(5), def_456 = runif(5))

# 1. 将宽表转为长表,保留id列,原列名存入var列
melted_dt <- melt(dt, id.vars = "id", variable.name = "var")
# 2. 拆分var列到char和num,然后删除原var列
melted_dt[, c("char", "num") := tstrsplit(var, "_", fixed = TRUE)][, var := NULL]

运行后得到的结果和tidyr::pivot_longer完全一致:

id      value char num
 1:  1 0.XXXXXXX  abc 123
 2:  2 0.XXXXXXX  abc 123
 3:  3 0.XXXXXXX  abc 123
 4:  4 0.XXXXXXX  abc 123
 5:  5 0.XXXXXXX  abc 123
 6:  1 0.XXXXXXX  def 456
 7:  2 0.XXXXXXX  def 456
 8:  3 0.XXXXXXX  def 456
 9:  4 0.XXXXXXX  def 456
10:  5 0.XXXXXXX  def 456

关键说明:

  • melt()的patterns()参数是用来将不同模式的列映射到多个value列,而非拆分变量名,所以之前的用法不符合需求。
  • tstrsplit()是data.table专门的字符串拆分函数,fixed = TRUE表示按固定字符(此处是下划线_)拆分,比正则表达式更高效;如果需要更复杂的正则匹配(对应原names_pattern),可以改用正则分隔符,比如:
    melted_dt[, c("char", "num") := tstrsplit(var, "(.*)_(.*)", perl = TRUE)[, -1]]
    

内容的提问来源于stack exchange,提问作者Ludwig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:32:58