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

