# 1. Leer correctamente el archivo (importantísimo el stringsAsFactors y el dec = ",")
datos <- read.csv("Sedimentos Marinos.csv", 
                  header = TRUE, 
                  sep = ";", 
                  dec = ",", 
                  stringsAsFactors = FALSE)

# 2. Convertir LATITUDE a número (por si acaso quedó como texto)
datos$LATITUDE <- as.numeric(as.character(datos$LATITUDE))
## Warning: NAs introduced by coercion
# 3. Eliminar posibles valores NA que puedan quedar
latitud <- na.omit(datos$LATITUDE)

# 4. Ahora sí todo funciona perfecto
min_lat <- min(latitud)
max_lat <- max(latitud)
rango   <- max_lat - min_lat
n       <- length(latitud)

# Calcular ancho de clase (máximo 15 clases, múltiplos de 5 o 10)
if (ceiling(rango/10) <= 15) {
  d <- 10
} else if (ceiling(rango/5) <= 15) {
  d <- 5
} else {
  d <- ceiling(rango/15 / 5) * 5
}

# Crear los intervalos bien alineados
inicio <- floor(min_lat / d) * d
fin    <- ceiling(max_lat / d) * d
breaks <- seq(inicio, fin, by = d)

# Tabla de frecuencias
clases <- cut(latitud, breaks = breaks, include.lowest = TRUE, right = FALSE, dig.lab = 10)
ni <- table(clases)
hi <- prop.table(ni)

# Frecuencias acumuladas
Ni_asc  <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc  <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))

# Tabla bonita
tabla <- data.frame(
  Clases = names(ni),
  ni = as.numeric(ni),
  hi = round(as.numeric(hi), 4),
  Ni_asc = as.numeric(Ni_asc),
  Ni_desc = as.numeric(Ni_desc),
  Hi_asc = round(as.numeric(Hi_asc), 4),
  Hi_desc = round(as.numeric(Hi_desc), 4)
)

# Totales
tabla <- rbind(tabla, c("Total", sum(tabla$ni), 1.0000, sum(tabla$ni), sum(tabla$ni), 1.0000, 1.0000))


print(tabla)
##         Clases   ni     hi Ni_asc Ni_desc Hi_asc Hi_desc
## 1  [-195,-130)    1  5e-04      1    2191  5e-04       1
## 2   [-130,-65)    0      0      1    2190  5e-04  0.9995
## 3      [-65,0)    0      0      1    2190  5e-04  0.9995
## 4       [0,65)  536 0.2446    537    2190 0.2451  0.9995
## 5     [65,130)    0      0    537    1654 0.2451  0.7549
## 6    [130,195)   64 0.0292    601    1654 0.2743  0.7549
## 7    [195,260)    4 0.0018    605    1590 0.2761  0.7257
## 8    [260,325)  272 0.1241    877    1586 0.4003  0.7239
## 9    [325,390)  124 0.0566   1001    1314 0.4569  0.5997
## 10   [390,455)  934 0.4263   1935    1190 0.8832  0.5431
## 11   [455,520)   25 0.0114   1960     256 0.8946  0.1168
## 12   [520,585)    1  5e-04   1961     231  0.895  0.1054
## 13   [585,650)   12 0.0055   1973     230 0.9005   0.105
## 14   [650,715)  217  0.099   2190     218 0.9995  0.0995
## 15   [715,780)    0      0   2190       1 0.9995   5e-04
## 16   [780,845]    1  5e-04   2191       1      1   5e-04
## 17       Total 2191      1   2191    2191      1       1
# GRÁFICOS (ya no fallarán)

# Diagrama de barras
barplot(ni, las = 2, col = "steelblue", 
        main = "Diagrama de barras - Frecuencia absoluta (ni)",
        xlab = "Clases de Latitud", ylab = "ni")

# Ojivas
lim_sup <- breaks[-1]

plot(lim_sup, Ni_asc, type = "o", col = "blue", pch = 16, 
     main = "Ojiva Ni (ascendente y descendente)", 
     xlab = "Latitud", ylab = "Frecuencia acumulada absoluta")
lines(lim_sup, Ni_desc, type = "o", col = "red", pch = 16)
legend("topleft", c("Ni Ascendente", "Ni Descendente"), col = c("blue","red"), pch = 16, lty = 1)

plot(lim_sup, Hi_asc, type = "o", col = "blue", pch = 16, 
     main = "Ojiva Hi (ascendente y descendente)", 
     xlab = "Latitud", ylab = "Frecuencia acumulada relativa")
lines(lim_sup, Hi_desc, type = "o", col = "red", pch = 16)
legend("bottomright", c("Hi Ascendente", "Hi Descendente"), col = c("blue","red"), pch = 16, lty = 1)