如何基于data.table子集(M1)对全表分类变量重新排序?
基于data.table子集数据对分类变量排序(ggplot可视化场景)
我在绘制分类数据热力图时,需要按数值对分类变量Var排序。虽然能用base函数reorder对data.table中的变量重排,但不知道如何**仅基于数据子集(如Model为M1的行)**完成整个数据表的分类变量排序。
示例代码与当前问题
library(data.table) library(ggplot2) dt <- data.table(Model = c(rep("M1", 4), rep("M2", 4)), Var = rep(c("First", "Second", "Third", "Fourth"), 2), Value = c(1,3,4,5, 6,7,2,8)) # 未排序时,Var按字母顺序展示 ggplot(dt, aes(x = Model, y = Var)) + geom_tile(aes(fill = Value)) # 基于所有数据的Value排序Var,但这不是我想要的结果 dt[, Var := reorder(Var, Value, decreasing = TRUE)] ggplot(dt, aes(x = Model, y = Var)) + geom_tile(aes(fill = Value))
需求说明
我需要仅基于M1的数据对Var排序,最终Var的顺序应为First, Second, Third, Fourth,且不想额外创建M1对应的虚拟列。
尝试过的无效操作
# 这些写法均未达到预期效果 dt[Model = "M1", Var := reorder(Var, Value, decreasing = TRUE), by = "M1"] dt[, Var := reorder(Var, Value, decreasing = TRUE), by = "M1"] setorder(dt, Value) # 完全没实现想要的分类变量排序
解决方案
方法1:手动指定因子水平
先从M1子集提取按Value升序排列的Var顺序,再将整个数据表的Var转换为指定水平的因子:
# 获取M1子集按Value升序排列的Var顺序 m1_order <- dt[Model == "M1"][order(Value)]$Var # 转换Var为因子,指定水平为m1_order dt[, Var := factor(Var, levels = m1_order)] # 绘图验证 ggplot(dt, aes(x = Model, y = Var)) + geom_tile(aes(fill = Value))
方法2:结合reorder与子集数据
直接用M1对应的Value作为排序权重,给每个Var赋值对应的M1的Value:
# 用M1的Value作为排序依据重排Var dt[, Var := reorder(Var, dt[Model == "M1", .(Var, Value)][match(Var, Var), Value], decreasing = FALSE)] # 绘图验证 ggplot(dt, aes(x = Model, y = Var)) + geom_tile(aes(fill = Value))
方法3:关联子集数据后排序
先获取每个Var在M1中的Value,再用该值排序:
# 关联M1的Value到整个数据表 m1_values <- dt[Model == "M1", .(Var, m1_val = Value)] dt <- dt[m1_values, on = "Var"] # 用m1_val重排Var dt[, Var := reorder(Var, m1_val, decreasing = FALSE)] # 可选:删除临时列 dt[, m1_val := NULL] # 绘图验证 ggplot(dt, aes(x = Model, y = Var)) + geom_tile(aes(fill = Value))
内容的提问来源于stack exchange,提问作者HarD
相关产品推荐
相关产品推荐

