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

