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

R data.table宽表列排序:dcast输出排序或setcolorder按数字模式调整

方案1:dcast后用setcolorder调整(更简单,推荐)

你之前的grep排序出错是因为没有限制正则匹配结尾,只要匹配规则足够精准,或者直接按需求生成目标列名序列即可实现预期排序:

# 先取到最长用药序列的长度
max_seq = max(DT$seq)
# 按你需要的交替顺序批量生成目标列名:id + th_rx1、drugs_rx1、th_rx2、drugs_rx2...
target_cols = c("id", as.vector(t(outer(c("th_rx", "drugs_rx"), 1:max_seq, paste0))))
# 直接调整列顺序
setcolorder(DT_wide, target_cols)

如果你习惯用正则匹配的方式实现,只要给匹配规则加结束符$,就能避免_rx1匹配到_rx10、_rx11这类列的问题:

max_seq = max(DT$seq)
target_cols = c("id", unlist(lapply(1:max_seq, function(i) {
  grep(paste0("_rx", i, "$"), colnames(DT_wide), value = TRUE)
})))
setcolorder(DT_wide, target_cols)

方案2:dcast阶段直接生成符合顺序的列

如果不想事后调整列顺序,也可以在dcast前给序号补前导零,让列名的字典序和数字序一致:

DT_wide = DT[, seq := seq(.N), by = .(id)][, 
  dcast.data.table(.SD, id ~ sprintf("rx%02d", seq), 
                  value.var = c("th", "drugs"), 
                  sep = "_")
]

这个方法生成的列名是th_rx01、drugs_rx01、th_rx02...自然按数字顺序排列,无需额外调整,但列名会多一个前导零,如果你不需要带零的列名,更推荐用方案1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:06:01