# 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)
