View(mtcars)
library(graphics)
myData <- aggregate(mtcars$mpg,#AGREGAR VALOR MGP
    by = list(cyl = mtcars$cyl, gears = mtcars$gear),# Y AGREGAR POR CYL Y GEAR
    FUN = function(x) c(mean = mean(x), sd = sd(x),
                        n = length(x)))#DEVOLVER MEDIA,SD,NUM DE OBSEVACIÓN

myData <- do.call(data.frame, myData)# CONVERTIR A D.F

myData$se <- myData$x.sd / sqrt(myData$x.n)#CALCULO DE ERROR ESTANDAR
colnames(myData) <- c("cyl", "gears", "mean", "sd", "n", "se")#CAMBIAR NOMBRES
myData$names <- c(paste(myData$cyl, "cyl /",
                        myData$gears, " gear"))#AGREGAR COLUMNA DE DESCRIPCION

par(mar = c(5, 6, 4, 5) + 0.1)#TAMAÑO DE GRAFICA

plotTop <- max(myData$mean) +
           myData[myData$mean == max(myData$mean), 6] * 3#VALOR MAXIMO

barCenters <- barplot(height = myData$mean,
                  names.arg = myData$names,
                  beside = true, las = 2,
                  ylim = c(0, plotTop),
                  cex.names = 0.75, xaxt = "n",
                  main = "Mileage by No. Cylinders and No. Gears",
                  ylab = "Miles per Gallon",
                  border = "black", axes = TRUE)

# Specify the groupings. We use srt = 45 for a
# 45 degree string rotation
text(x = barCenters, y = par("usr")[3] - 1, srt = 45,
     adj = 1, labels = myData$names, xpd = TRUE)

segments(barCenters, myData$mean - myData$se * 2, barCenters,
         myData$mean + myData$se * 2, lwd = 1.5)

arrows(barCenters, myData$mean - myData$se * 2, barCenters,
       myData$mean + myData$se * 2, lwd = 1.5, angle = 90,
       code = 3, length = 0.05)

tapply(myData$mean, list(myData$cyl, myData$gears),
       function(x) c(x = x))
##       3      4    5
## 4 21.50 26.925 28.2
## 6 19.75 19.750 19.7
## 8 15.05     NA 15.4
tabbedMeans <- tapply(myData$mean, list(myData$cyl,
                                      myData$gears),
                         function(x) c(x = x))
tabbedSE <- tapply(myData$se, list(myData$cyl,
                                      myData$gears),
                         function(x) c(x = x))

barCenters <- barplot(height = tabbedMeans,
                      beside = TRUE, las = 1,
                      ylim = c(0, plotTop),
                      cex.names = 0.75,
                      main = "Mileage by No. Cylinders and No. Gears",
                      ylab = "Miles per Gallon",
                      xlab = "No. Gears",
                      border = "black", axes = TRUE,
                      legend.text = TRUE,
                      args.legend = list(title = "No. Cylinders", 
                                         x = "topright",
                                         cex = .7))

segments(barCenters, tabbedMeans - tabbedSE * 2, barCenters,
         tabbedMeans + tabbedSE * 2, lwd = 1.5)

arrows(barCenters, tabbedMeans - tabbedSE * 2, barCenters,
       tabbedMeans + tabbedSE * 2, lwd = 1.5, angle = 90,
       code = 3, length = 0.05)