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

