使用tapply时避免重新组织因素

时间:2017-05-18 21:07:45

标签: r

我在RStudio中使用tapply()对我的数据进行总结和重组,以便根据https://www.r-bloggers.com/building-barplots-with-error-bars/制作更好的图表。代码工作正常,见下文,除了它按字母顺序重新组织我的因素,这导致恼人的组织情节。正如你在这里看到的: example plot, some info cut

因子按字母顺序排列,但我更喜欢将控件作为每组中的最后一个条。有没有办法阻止这种重组?

如果您要重现此问题,上面的链接提供了一个可重复的示例,其中包含完全相同的问题。这是我正在使用的代码。请注意,上面显示的图像有一些简单的东西。

OCCtabbedMeans <- tapply(occdata2$mean, list(occdata2$dist3,
                                      occdata2$Dispersal_window),
                  function(x) c(x = x))
OCCtabbedSE <- tapply(occdata2$se, list(occdata2$dist3,
                                 occdata2$Dispersal_window),
               function(x) c(x = x))

OCCbarCenters <- barplot(height = OCCtabbedMeans,
                  beside = TRUE, las = 1,
                  ylim = c(0, 1),
                  cex.names = 0.75,
                  main = NULL,
                  xaxt="n",
                  ylab = "y",
                  xlab = "x",
                  border = "black", axes = TRUE,
                  legend.text = TRUE,
                  args.legend = list(title = NULL, 
                                     x = "topleft",
                                     cex = .7))
mtext(side=1,cex=0.75,"Low",adj=0.15)
mtext(side=1,cex=0.75,"High",adj=0.89)

segments(OCCbarCenters, OCCtabbedMeans - OCCtabbedSE * 2, OCCbarCenters,
     OCCtabbedMeans + OCCtabbedSE * 2, lwd = 1.5)

arrows(OCCbarCenters, OCCtabbedMeans - OCCtabbedSE * 2, OCCbarCenters,
   OCCtabbedMeans + OCCtabbedSE * 2, lwd = 1.5, angle = 90,
   code = 3, length = 0.05)

****编辑****这个问题被标记为一个问题的副本,询问如何按字母顺序重新排序一个因子,这与我试图做的相反。

1 个答案:

答案 0 :(得分:1)

您可以在levels=调用中使用factor()参数将因子级别的顺序设置为您希望它们的任何值。例如,

# some fake data
x <- factor(sample(letters[1:3],15,replace=T))
y <- rnorm(15)

tapply(y, x, mean)
#          a          b          c 
# -0.8467318  0.1967837  0.2303459 

# changing the order with the levels= argument...
x <- factor(x, levels=c("b","c","a"))

# changes the order in the tapply call
tapply(y, x, mean)
#         b          c          a 
# 0.1967837  0.2303459 -0.8467318 

您还可以重新排列tapply()调用...

的输出顺序
xxx <- tapply(y, x, mean)
xxx
#         b          c          a 
# 0.1967837  0.2303459 -0.8467318 

xxx[c(3,2,1)]
#         a          c          b 
# -0.8467318  0.2303459  0.1967837