如何用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
相关产品推荐
相关产品推荐

