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

使用tidyverse的pivot_wider转宽表时,如何保留因子原始排序?

解决pivot_wider后因子顺序错乱的问题

你的问题核心是pivot_wider后,nihss的因子顺序没有遵循预先定义的水平——原因是部分periodo+lugar组合缺失部分nihss水平,导致转宽时仅保留了数据中实际出现的nihss值,且顺序被打乱。可以通过以下两种方法解决:

方法一:补全所有因子水平后转宽(推荐)

先补全periodo、lugar和nihss的所有可能组合,缺失的porcent填充为0,确保所有nihss因子水平都被保留,再执行转宽操作:

library(tidyverse)
library(knitr)

stroke <- structure(list(periodo = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1), lugar = c("A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "A", "A", "A", "B", "B", "B", "B", "B"), nihss = structure(c(2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 6L), levels = c("0","1-4","5-15","16-20","20+","9999"), class = "factor"), porcent = c(5, 56, 17, 22, 1, 12, 53, 15, 18, 1, 30, 30, 40, 6, 37, 27, 28, 2)), row.names = c(NA, -18L), class = "data.frame")

stroke %>%
  complete(periodo, lugar, nihss, fill = list(porcent = 0)) %>%
  pivot_wider(names_from = c(lugar, periodo), values_from = porcent) %>%
  arrange(nihss) %>%
  kable()

方法二:转宽后重新指定因子顺序

如果不需要补全所有组合,也可以在转宽后重新定义nihss的因子水平并排序:

stroke %>%
  pivot_wider(names_from = c(lugar, periodo), values_from = porcent, values_fill = 0) %>%
  mutate(nihss = factor(nihss, levels = c("0","1-4","5-15","16-20","20+","9999"))) %>%
  arrange(nihss) %>%
  kable()

关键说明

  • complete()函数会生成所有变量的笛卡尔积组合,确保每个nihss水平在所有分组下都有记录,从根源避免因子水平丢失或顺序错乱。
  • arrange(nihss)会严格按照nihss的原始因子水平排序,保证最终宽表的行顺序完全符合你的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:37:35