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

R语言使用pivot_wider时如何保留arrange预先设置的排序顺序

问题解决方案

问题核心是pivot_wider默认按name列的原有取值匹配列名,仅对行内值排序没有修改name列的对应关系,因此转宽表后值会映射回原列,导致顺序失效。

正确的实现逻辑是:对行内值排序后,为每个组内的排序结果重新生成对应ALT_*的新列名,再做宽表转换,实现代码如下:

library(dplyr)
library(tidyr)
df %>% 
  mutate(id = row_number()) %>% 
  pivot_longer(-id) %>% 
  group_by(id) %>% 
  # 按值升序排序,NA默认排在最后符合预期
  arrange(value, .by_group = TRUE) %>% 
  # 生成排序后的新列名,替换原有的name列
  mutate(name = paste0("ALT_", row_number())) %>% 
  pivot_wider(
    names_from = name,
    values_from = value
  ) %>% 
  # 可选:去除辅助id列,恢复原有列顺序
  ungroup() %>% 
  select(-id, all_of(paste0("ALT_", 1:4)))

运行上述代码即可得到预期输出:

ALT_1 ALT_2 ALT_3 ALT_4
1   AGT   CAG     G   GAT
2   TGA   TGC  <NA>  <NA>
3   AGC   CGC   TGA  <NA>
4     T  <NA>  <NA>  <NA>

如果不想用长宽转换的方式,也可以直接用行内遍历的方案,代码更简洁:

library(dplyr)
library(purrr)
df %>% 
  mutate(across(everything(), as.character)) %>% 
  pmap_dfr(~sort(c(...), na.last = TRUE) %>% 
            set_names(paste0("ALT_", 1:length(.))))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:15:05