重复要素级别时锁定要素级别顺序

时间:2018-06-28 15:35:27

标签: r ggplot2 data-manipulation

我试图锁定变量的因子级别顺序,以使结果以与数据框相同的顺序显示在图中。

datad$outcome <- factor(data$outcome, levels = unadjusted.combined$outcome)

当某些行重复时,是否有一种方法可以解决此问题的顺序:我的行重复,因为我有两种不同度量的结果,这会产生错误:

Error in `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels,  : factor level [54] is duplicated

我的数据看起来像这样;

xvar   outcome
x1     wt_2
x1     wt_3
x1     wt_4
x1     bmi_2
x1     bmi_3  
x1     bmi_4
x2     wt_2
x2     wt_3
x2     wt_4
x2     bmi_2
x2     bmi_3  
x2     bmi_4

最后,我制作了如下图:(当前结果按字母顺序排列)

ggplot(data=data, aes(x=outcome, y=estimate, ymin=lci, ymax=uci, colour=xvar)) +  geom_pointrange() + geom_hline(yintercept=0, lty=2) + coord_flip()

1 个答案:

答案 0 :(得分:1)

这里是一个答案的尝试。根据您的问题,您希望结果遵循原始数据的顺序,而不要遵循默认的字母顺序。
以下是一些示例数据:

data<-structure(list(xvar = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
                      2L, 2L, 2L, 2L, 2L), .Label = c("x1", "x2"), class = "factor"), 
           outcome = structure(c(4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 
                     1L, 2L, 3L), .Label = c("bmi_2", "bmi_3", "bmi_4", "wt_2", 
                      "wt_3", "wt_4"), class = "factor"), estimate = c(10.40, 
                       11.24, 10.09, 14.64, 10.48, 8.71, 13.27, 8.87, 9.97, 
                       13.12, 12.17, 8.44)), row.names = c(NA, 
                                          -12L), class = "data.frame")

xvaroutcome均默认为因数。如果我们运行ggplot plot命令:

ggplot(data=data, aes(x=outcome, y=estimate,  colour=xvar, ymin=0, ymax=15)) +  
  geom_pointrange() + geom_hline(yintercept=0, lty=2) #+ coord_flip()

x轴按字母顺序排列:
enter image description here

现在要保留原始顺序,我们可以在factor函数中使用ordered = TRUE选项。使用levels=

传递正确的订单
#order the factors in the order they appear in the data frame
data$outcome <- factor(data$outcome, levels= unique(data$outcome), ordered=TRUE)

ggplot(data=data, aes(x=outcome, y=estimate,  colour=xvar, ymin=0, ymax=15)) +  
  geom_pointrange() + geom_hline(yintercept=0, lty=2) #+ coord_flip()

现在,我们保持正确的顺序。 enter image description here

这是您的问题变得模糊的地方。如果要按相同的顺序绘制x1和x2的结果,则需要通过paste(data $ xvar,data $ outcome)创建一个新变量,然后将该新变量用作x轴。

希望这能回答您的问题。