R code used for the paper: “Factors Determining the Probability for Irregular Central American Migrants to Reside in the United States”

##### STEP 1: CREATE THE POINTS ON THE MEX-USA BORDER
##### STEP 2: CREATE THE POINTS ON THE PACIFIC COAST
##### STEP 3: CREATE THE POINTS IN THE GULF OF MEXICO
##### STEP 4: CREATE THE OTHER EAST COAST (Atlantic) POINTS
##### STEP 5: GATHER ALL AT-RISK COUNTIES (FAILURE)
##### STEP 6: ELIMINATE THE REPEATED POINTS

require(sf)
## Loading required package: sf
## Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
require(housingData)
## Loading required package: housingData
require(dplyr)
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
require(mapview)
## Loading required package: mapview
require(psych)
## Loading required package: psych
require(geosphere)
## Loading required package: geosphere
## Warning: package 'geosphere' was built under R version 4.4.1
require(readr)
## Loading required package: readr

STEP 1: CREATE MEXICO-USA BORDER POINTS

point_border  <- read_csv("~/Desktop/OneDrive - United Nations/IFF/MATEMÁTICAS/MODELO LOGISTICO/Coordenadas frontera.csv")
## Rows: 20 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (4): OBJECTID, fid_1, X, Y
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
pb <- data.frame(lat = point_border$Y, long = point_border$X)

1.1. CALIFORNIA POINTS

pb_CA <- pb[1:2,]

Function to calculate the midpoint between boundary points

Suppose we have 3 original points (1, 2 and 3)
We generate 2 midpoints: the midpoint between point 1 and point 2
and the midpoint between point 2 and point 3

Now, the original base (pb) has 20 rows
With our function, our new array will have 2n - 1 = 2×20 - 1 = 39 rows
That is: the last data of pb (n = 20) will not be in the position n = 20 of our new array but in row 39

As we create 2 middle points, there are only 2 iterations

funcion_punto_medio_frontera <- function(pb) {   # en la primera iteracion, se guarda el punto original 1 y se obtiene el punto medio entre los puntos 1 y 2
  # en la siguiente iteracion, se obtiene el punto original 2 y se obtiene el punto medio entre los puntos 2 y 3 
  # ya no hay iteracion (entonces falta guadar el punto original 3)
  i <- 1   
  n <- nrow(pb)
  puntos_medio_long <- c() 
  puntos_medio_lat <- c() 
  k <- 1                                    # la k es para guardar los puntos en la salida (nuevo arreglo) 
  
  
  while (i <= n - 1) {                   # Con 3 puntos originales (n), obtenemos 2 puntos medio (n-1) 
    
    
    # Etapa 1: Creamos p1 y p2 para obtener su punto medio
    
    p1 <- c(pb$long[i], pb$lat[i])         # varian los puntos de pb pero no se guardan 
    p2 <- c(pb$long[i + 1], pb$lat[i + 1]) # el punto 2 es la segunda fila de la base original. Se usa para obtener el punto medio entre los ptos 1 y 2 
    
    pm <- midPoint(p1, p2)                   
    
    # Etapa 2: Creamos la columna longitud (que contiene pto 1 y pto medio) y la columna latitud (que contiene pto 1 y pto medio) 
    
    puntos_medio_long[k] <- p1[1]          # usamos una k para guardar el punto original. aqui, se guardan LOS puntos 
    puntos_medio_lat[k] <-  p1[2]         
    
    puntos_medio_long[k + 1] <- pm[1]      # usamos k + 1 para guardar el punto medio 
    puntos_medio_lat[k + 1]  <- pm[2]
    
    k <- k + 2                            # las 2 primeras filas del arreglo nuevo ya son guardadas, entonces se le agrega 2 a k
    # para que guarde el siguiente punto original en una fila vacia
    # pasa esto porque estamos agregando a la salida 1 fila procedente de la base original + 1 fila del punto medio
    i <- i + 1    
    
  }
  
  # El ultimo punto de pb no aparece porque la i va hasta n - 1, la i nunca toma este valor pero el ultimo punto esta en n
  # Entonces se agrega el ultimo punto original (ubicado en la posicion n) al nuevo arreglo:
  
  # El numero de filas de nuestro arreglo va a ser 3 puntos originales (n) + 2 puntos nuevos = 5 ptos
  # Es decir: n + n - 1 = 2n - 1 = 5 ptos
  # Es decir: la ultima fila esta en la posicion 2n - 1
  
  # Se hace fuera del while porque solo se trata de un punto, el ultimo
  
  puntos_medio_long[2 * n - 1] <- pb$long[n]   # 2 x 3 - 1 = 6 - 1 = 5 = ultima fila del arreglo original
  puntos_medio_lat[2 * n - 1] <- pb$lat[n]     
  
  return(data.frame(long = puntos_medio_long, lat = puntos_medio_lat))
}

nuevos_puntos_CA <- funcion_punto_medio_frontera(pb_CA)  # 3 puntos originales + 2 puntos medios = 5 puntos
pb_CA_3_puntos <- funcion_punto_medio_frontera(pb_CA)

mapview(pb_CA_3_puntos, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)

Add the point in Yuma:

pb_CA_4_puntos <- rbind(pb_CA_3_puntos, c(-114.7254, 32.71798))

vector_puntos <- paste("punto", 1:nrow(pb_CA_4_puntos), sep = "")

pb_CA_4_puntos <- cbind(vector_puntos, pb_CA_4_puntos)

mapview(pb_CA_4_puntos, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)

1.2 Create the points in Arizona

pb_ARIZ <- pb[3:6,]
pb_ARIZ  
##        lat      long
## 3 32.31493 -114.2221
## 4 31.80396 -112.5694
## 5 31.33299 -110.9168
## 6 31.33432 -109.1690

Replace column 1 by column 2

pb_ARIZ[,c(2,1)]
##        long      lat
## 3 -114.2221 32.31493
## 4 -112.5694 31.80396
## 5 -110.9168 31.33299
## 6 -109.1690 31.33432
pb_ARIZ <- pb_ARIZ[,c(2,1)]

ARIZONA counties to calculate the distance between each point y each county

condados_ARIZ <- geoCounty %>% filter(rMapState == "arizona")

vector_puntos <- paste("punto", 1:nrow(pb_ARIZ), sep = "")

pb_ARIZ <- cbind(vector_puntos, pb_ARIZ)


mapview(pb_ARIZ, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)

1.3. Create the New Mexico points

################ New Mexico State

pb_NM <- pb[7:8,]


pb_NM <- pb_NM[,c(2,1)]

condados_NM <- geoCounty %>% filter(rMapState == "new mexico")

dim(condados_NM)
## [1] 33  7
vector_puntos <- paste("punto", 1:nrow(pb_NM), sep = "")


pb_NM <- cbind(vector_puntos, pb_NM)

mapview(pb_NM, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)

1.4. Construir los puntos en Texas

pb_TX <- pb[8:20,]

Sustituir la columna 1 por la columna 2

pb_TX <- pb_TX[,c(2,1)]

condados_TX <- geoCounty %>% filter(rMapState == "texas")

vector_puntos <- paste("punto", 1:nrow(pb_TX), sep = "")

pb_TX <- cbind(vector_puntos, pb_TX)

mapview(pb_TX, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
par(mfrow = c(2,2))

mapview(pb_CA_4_puntos, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
mapview(pb_ARIZ, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
mapview(pb_NM, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
mapview(pb_TX, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)

1.5. Build the dataset of the border points

pb_lon <- c(pb_CA_4_puntos[,2], pb_ARIZ[,2], pb_NM[1,2], pb_TX[,2])

pb_lat <- c(pb_CA_4_puntos[,3], pb_ARIZ[,3], pb_NM[1,3], pb_TX[,3])

nombres <- paste("punto", 1:length(pb_lon), sep = "")


arreglo_pb <- data.frame(puntos = nombres, lon = pb_lon, lat = pb_lat)

mapview(arreglo_pb, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)

1.6. Build the dataset of centroid of all counties in the U.S. border states.

condados_CA <- geoCounty %>% filter(rMapState  == "california") 
condados_ARIZ <- geoCounty %>% filter(rMapState == "arizona")
condados_NM <- geoCounty %>% filter(rMapState == "new mexico")
condados_TX <- geoCounty %>% filter(rMapState == "texas")
arreglo_condados_estados_fronterizos_USA <- rbind(condados_CA, condados_ARIZ, condados_NM, condados_TX)

mapview(arreglo_condados_estados_fronterizos_USA, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)

From here, there are 3 steps:

  1. Calculate the distances between each border point (base “pb”) and each county (base “county”)

  2. Obtain the distance between each county and its nearest border point For example, row 1 is the distance between the county “alameda” and the nearest border point to this county (which is obtained with min) before min, we had the distance between each county and each border point with min, we only have the distance between each county and its nearest border point

  3. Filter out the counties that are less than 200 km away from the border.

1.7. Calculate the distances between each border point (base “pb”) and each county (base “county”).

For example, row 1 is the distance between the county “alameda” and the closest border point to this county (obtained with min) before min, we had the distance between each county and each border point with min, we only have the distance between each county and its single closest border point.

Distancia_cada_checkpoint_cada_condado3 <- function(condados_CA, pb_CA)  {    # en este caso, estamos usando los condados y pb de CA. Pero podemos usar la funcion para cualquier otro
  
  i <- 1
  n <- nrow(condados_CA)
  num_pb <- nrow(pb_CA)
  
  nombres_pb <- c()
  nombres_condados <- c()
  distancia_cada_checkpoint_cada_condado <- c()
  estado <- c()
  lon <- c()
  lat <- c()
  
  k <- 1                  # k es el numero de distancias calculadas (# de checkpoints * # de condados)
  # k se pone fuera de los whiles para que no se reinicie y no dependa de i o j para avanzar
  
  while (i <= n) {   # se fija el condado
    
    j <- 1              # j se define dentro del primer while porque: para un i (condado), j (checkpoint) varia
    # se recorren todos los checkpoints de CA antes de pasar al siguiente condado
    
    while (j <= num_pb) {
      
      points <- data.frame(long = c(pb_CA[j, 2], condados_CA[i, 4]),   # primero, viene lon y despues lat
                           lat = c(pb_CA[j, 3], condados_CA[i, 5]))    
      
      points_sf <- st_as_sf(points , crs = 4326L , coords = c("long", "lat"))  # sf = simple features. convert points to geometry points
      
      distancia_cada_checkpoint_cada_condado[k] <- st_distance(points_sf)[1,2] / 1000   # redondear a 0 decimal
      
      #nombres_pb[k] <- pb_CA[j, 1]    # nombres_checkpoint se coloca al mismo nivel del contador de distancias k (mismo while)
      # se rellena el vector con los nbres de checkpoints k veces (numero de distancias)
      
      nombres_pb[k] <- arreglo_pb[j, 1]  
      
      nombres_condados[k] <- as.character(condados_CA[i, 7])     # cuando j = 1, i es 1. cuando j = 2, i sigue en 1. cambia i cuando se termina de recorrer todas las j
      # R entiende que se repite los nbres de condados tantas veces como checkpoints porque j varia de 1 al num de checkpoints 
      
      lon[k] <- condados_CA[i, 4]
      lat[k] <- condados_CA[i, 5]
      
      estado[k] <- as.character(condados_CA[i, 6])
      
      # se debe guardar como vector de character para que, en nuestra salida, no aparezca como variabe numerica
      
      # k + 1 ayuda a rellenar el vector salida
      k <- k + 1        # Por cada distancia que calculemos, queremos que k aumente 1
      # se pone aqui para guardar el siguiente valor de distancia
      
      j <- j + 1 
      
    }
    
    
    i <- i + 1 
    
  }
  
  
  return(data.frame(estados = estado, condado = nombres_condados, pb = nombres_pb, distancia = distancia_cada_checkpoint_cada_condado, 
                    lon = lon, lat = lat))
  
}
dist_todos_condados_todos_pb <- Distancia_cada_checkpoint_cada_condado3(arreglo_condados_estados_fronterizos_USA, arreglo_pb)

1.8. Function to obtain the distance between each county and its nearest border point The coordinates do not change, they are used as a reference.

The function selects the counties that are at the minimum distance from the border points (with their lon and lat).

For example, row 1 is the distance between the county “alameda” and the nearest border point to this county (which is obtained with min) before min, we had the distance between each county and each border point with min, we only have the distance between each county and its nearest border point

dist_min_por_grupo_condado <- function(dist_todos_condados_todos_pb) { 
  
  i <- 1
  # num_condados <- length(unique(dist_todos_condados_todos_pb$condado))  
  num_condados <- 360 # son 360 condados de los 4 estados fronterizos de EE.UU. (CA, ARIZ, NM, TX)
  num_pb <- length(unique(dist_todos_condados_todos_pb[, 3]))
  dist <- c()
  nombre_condados <- c()
  lon <- c()
  lat <- c()     # la salida tiene que ser de la misma dimension que el numero de i (es decir de condados)
  estado <- c()
  
  li <- 0        
  ls <- num_pb     # dist_todos_condados_todos_pb contiene los 22 puntos frontera, por bloque (se repiten). 
  # son 22 puntos frontera y luego nuevamente los mismos 22 puntos frontera
  
  while (i <= num_condados) {
    
    li <- li + 1              # es para que, en la segunda iteracion, la fila sea 23 y no 22 
    
    distancias <- dist_todos_condados_todos_pb[li:ls, 4]            ## 22 distancias en cada iteracion (hay 22 puntos fronterizos)
    
    dist_min_funcion <- min(distancias) 
    
    posicion <- which(dist_min_funcion == dist_todos_condados_todos_pb[, 4]) ## da la posicion del valor minimo  
    ## para poder ubicar la lon, lat y nbre del condado
    
    #print(posicion)
    
    lon[i] <- dist_todos_condados_todos_pb[posicion, 5] 
    
    lat[i] <- dist_todos_condados_todos_pb[posicion, 6]
    
    dist[i] <- dist_min_funcion
    
    estado[i] <- dist_todos_condados_todos_pb[posicion, 1]
    
    nombre_condados[i] <- dist_todos_condados_todos_pb[posicion, 2] 
    
    li <- ls 
    
    i <- i + 1       # construyo la i + 1 antes de ls (abajo) porque ls depende de i
    
    ls <- i * num_pb # es la ls de cada bloque. para el bloque 1, es i * 22 = 1 * 22  = 22. Para el 2ndo bloque, es i * 22 = 2 * 22 = 44
    
  }
  return(data.frame(estado, nombre_condados, dist, lon, lat))
  
}
data_frame_dist_min_por_grupo_condado <- dist_min_por_grupo_condado(dist_todos_condados_todos_pb)

1.9. Filtering the counties less than 200 km from the border

First, we tried to do it with “filter” but we didn’t get the coordinates so when we extracted with map county, it extracted all the counties that had the same name . For example, there are two Orange counties: in the border and outside the border.

Below is the attempt with filter: dist_min_all_counties_all_pb_minus_160 <- dist_min_all_counties_all_pb %>% #filter(min(distance) <= 160) dim(dist_min_all_counties_all_pb_all_pb_minus_160)

FUNCTION THAT FILTERS THE COUNTIES WITH LESS THAN 200 KM OF DISTANCE

dist_min_todos_condados_todos_pb <- dist_todos_condados_todos_pb %>% group_by(condado) %>% summarise(min(distancia))
head(dist_min_todos_condados_todos_pb)
## # A tibble: 6 × 2
##   condado  `min(distancia)`
##   <chr>               <dbl>
## 1 alameda              713.
## 2 alpine               717.
## 3 amador               731.
## 4 anderson             576.
## 5 andrews              281.
## 6 angelina             634.

1.9. Filtar los condados de menos de 200 km de la frontera

Primero, lo intentamos hacer con “filter” pero no obteniamos las coordendas lo que hace que cuando extraimos con map county, nos extraia todos los condados que tenian el mismo nbre Por ej, hay dos condados Orange: en la franja y fuera de la franja

Abajo viene el intento con filter: dist_min_todos_condados_todos_pb_menos_160 <- dist_min_todos_condados_todos_pb %>% #filter(min(distancia) <= 160) dim(dist_min_todos_condados_todos_pb_menos_160)

FUNCION QUE FILTRA LOS CONDADOS CON MENOS DE 200 KM DE DISTANCIA

filtro_condados_menos_161 <- function(data_frame_dist_min_por_grupo_condado, umbral) {
  i <- 1
  n <- nrow(data_frame_dist_min_por_grupo_condado)
  nombre_condados <- c()
  dist <- c()
  lon <- c()
  lat <- c()
  estado <- c()
  
  k <- 1     # la dimension de la salida es menor que la de la base "data_frame_dist_min_por_grupo_condado", por eso se usa k
  
  while (i <= n) {   # las iteraciones se acaban hasta checar todas las filas de data_frame_dist_min_por_grupo_condado)
    
    if(data_frame_dist_min_por_grupo_condado[i, 3] <= umbral) 
      
    {
      
      dist[k] <- data_frame_dist_min_por_grupo_condado[i, 3]
      
      nombre_condados[k] <- data_frame_dist_min_por_grupo_condado[i, 2]
      
      lon[k] <- data_frame_dist_min_por_grupo_condado[i, 4]
      
      lat[k] <- data_frame_dist_min_por_grupo_condado[i, 5]
      
      estado[k] <- data_frame_dist_min_por_grupo_condado[i, 1]
      
      k <- k + 1
      
    }
    
    else{k <- k} 
    
    i <- i + 1    
    
  }
  
  return(data.frame(estado, nombre_condados, dist, lon, lat))
  
  
  
}

umbral <- 161

STEP 2: CREATE THE POINTS ON THE PACIFIC COAST 2.1. CREATE THE POINTS OF THE PACIFIC COAST (CALIFORNIA) We start from the extreme points and calculate their midpoints.

ultimo_punto_CA <- data.frame(lat = c(34.92197, 37.30028, 39.60569, 41.95132), 
                              long = c(-120.65186, -122.40967, -123.78296, -124.18945))
ultimo_punto_CA
##        lat      long
## 1 34.92197 -120.6519
## 2 37.30028 -122.4097
## 3 39.60569 -123.7830
## 4 41.95132 -124.1894
mapview(ultimo_punto_CA, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)

Incluir el punto al extremo sur de CA:

extremos_CA <- rbind(pb[1,], ultimo_punto_CA)

mapview(extremos_CA, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)

Include the point to the South extreme of CA:

nuevos_extremos_CA <- funcion_punto_medio_frontera(extremos_CA)

vector_puntos <- paste("punto", 1:nrow(nuevos_extremos_CA), sep = "")
vector_puntos
## [1] "punto1" "punto2" "punto3" "punto4" "punto5" "punto6" "punto7" "punto8"
## [9] "punto9"
nuevos_extremos_CA <- cbind(vector_puntos, nuevos_extremos_CA)

mapview(nuevos_extremos_CA , xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
ultimo_punto_CA <- data.frame(lat = c(33.73804, 34.92197, 36.09350, 37.30028, 38.45511, 39.60569, 40.77222, 41.95132), 
                              long = c(-118.39417, -120.65186, -121.62415, -122.40967, -123.08538, -123.78296, -124.18945, -124.18945))

ultimo_punto_CA <- rbind(pb[1,], ultimo_punto_CA) 


ultimo_punto_CA <- cbind(vector_puntos, ultimo_punto_CA)


mapview(ultimo_punto_CA , xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
ultimo_punto_CA <- ultimo_punto_CA[,c(3,2)]

dim(ultimo_punto_CA)
## [1] 9 2
ultimo_punto_CA <- cbind(vector_puntos, ultimo_punto_CA)

2.2.CALCULATING THE DISTANCE BETWEEN THE POINTS OF THE PACIFIC COAST AND THE PACIFIC COAST

last point CA = 9 points of the coast counties_CA = the 58 counties of CA The number of rows of the base resulting from the function below should be 9*58 = 522

dist_costa_condados_CA_costa_pacifica <- Distancia_cada_checkpoint_cada_condado3(condados_CA, ultimo_punto_CA)
dim(dist_costa_condados_CA_costa_pacifica) # 522
## [1] 522   6
Distancia_cada_checkpoint_cada_condado3 <- function(condados_CA, ultimo_punto_CA)  {    # en este caso, estamos usando los condados y pb de CA. Pero podemos usar la funcion para cualquier otro
  
  i <- 1
  n <- nrow(condados_CA)
  num_pb <- nrow(ultimo_punto_CA)
  
  nombres_pb <- c()
  nombres_condados <- c()
  distancia_cada_checkpoint_cada_condado <- c()
  estado <- c()
  lon <- c()
  lat <- c()
  
  k <- 1                  # k es el numero de distancias calculadas (# de checkpoints * # de condados)
  # k se pone fuera de los whiles para que no se reinicie y no dependa de i o j para avanzar
  
  while (i <= n) {   # se fija el condado
    
    j <- 1              # j se define dentro del primer while porque: para un i (condado), j (checkpoint) varia
    # se recorren todos los checkpoints de CA antes de pasar al siguiente condado
    
    while (j <= num_pb) {
      
      points <- data.frame(long = c(ultimo_punto_CA[j, 2], condados_CA[i, 4]),   # primero, viene lon y despues lat
                           lat = c(ultimo_punto_CA[j, 3], condados_CA[i, 5]))    
      
      points_sf <- st_as_sf(points , crs = 4326L , coords = c("long", "lat"))  # sf = simple features. convert points to geometry points
      
      distancia_cada_checkpoint_cada_condado[k] <- st_distance(points_sf)[1,2] / 1000   # redondear a 0 decimal
      
      nombres_pb[k] <- ultimo_punto_CA[j, 1]    # nombres_checkpoint se coloca al mismo nivel del contador de distancias k (mismo while)
      # se rellena el vector con los nbres de checkpoints k veces (numero de distancias)
      
      nombres_condados[k] <- as.character(condados_CA[i, 7])     # cuando j = 1, i es 1. cuando j = 2, i sigue en 1. cambia i cuando se termina de recorrer todas las j
      # R entiende que se repite los nbres de condados tantas veces como checkpoints porque j varia de 1 al num de checkpoints 
      
      lon[k] <- condados_CA[i, 4]
      lat[k] <- condados_CA[i, 5]
      
      estado[k] <- as.character(condados_CA[i, 6])
      
      # se debe guardar como vector de character para que, en nuestra salida, no aparezca como variabe numerica
      
      # k + 1 ayuda a rellenar el vector salida
      k <- k + 1        # Por cada distancia que calculemos, queremos que k aumente 1
      # se pone aqui para guardar el siguiente valor de distancia
      
      j <- j + 1 
      
    }
    
    
    i <- i + 1 
    
  }
  
  
  return(data.frame(estados = estado, condado = nombres_condados, pb = nombres_pb, distancia = distancia_cada_checkpoint_cada_condado, 
                    lon = lon, lat = lat))
  
}
dist_costa_pac <- Distancia_cada_checkpoint_cada_condado3(condados_CA, ultimo_punto_CA)
dim(dist_costa_pac)
## [1] 522   6

2.3. ASSIGN TO EACH COUNTY ITS NEAREST BORDER POINT

dist_min_por_grupo_condado2 <- function(dist_costa_pac) { 
  
  i <- 1
  # num_condados <- length(unique(dist_todos_condados_todos_pb$condado))  
  num_condados <- 58 # son 58 condados de CA
  num_pb <- length(unique(dist_costa_pac[,3]))
  dist <- c()
  nombre_condados <- c()
  lon <- c()
  lat <- c()     # la salida tiene que ser de la misma dimension que el numero de i (es decir de condados)
  estado <- c()
  
  li <- 0        
  ls <- num_pb
  
  while (i <= num_condados) {
    
    li <- li + 1              # es para que, en la segunda iteracion, la fila sea 23 y no 22 
    
    distancias <- dist_costa_pac[li:ls, 4]            ## 22 distancias en cada iteracion
    
    dist_min_funcion <- min(distancias) 
    
    posicion <- which(dist_min_funcion == dist_costa_pac[, 4]) ## da la posicion de la distancia minimo 
    
    #print(posicion)
    
    lon[i] <- dist_costa_pac[posicion, 5] 
    
    lat[i] <- dist_costa_pac[posicion, 6]
    
    dist[i] <- dist_min_funcion
    
    nombre_condados[i] <- dist_costa_pac[posicion, 2]  
    
    estado[i] <- dist_costa_pac[posicion, 1]
    
    li <- ls 
    
    i <- i + 1       # construyo la i + 1 antes de ls porque ls depende de i
    
    ls <- i * num_pb # es la ls de cada bloque. para el bloque 1, es i * 22 = 1 * 22  = 22. Para el 2ndo bloque, es i * 22 = 2 * 22 = 44
    
  }
  return(data.frame(estado, nombre_condados, dist, lon, lat))
}
data_frame_dist_min_por_grupo_condado_costa <- dist_min_por_grupo_condado2(dist_costa_pac)
dim(data_frame_dist_min_por_grupo_condado_costa)
## [1] 58  5

2.4. FILTER THE COASTAL COUNTIES THAT ARE LESS THAN 200 KM AWAY FROM EACH OTHER

#data_frame_dist_min_por_grupo_condado_costa %>% filter(dist <= umbral)

umbral <- 161

condados_frontera_menos_161 <- filtro_condados_menos_161(data_frame_dist_min_por_grupo_condado, umbral)
dim(condados_frontera_menos_161)
## [1] 49  5
mapview(condados_frontera_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)

#condados_costa_menos_161 <- filtro_condados_menos_161(, umbral) 
#head(condados_costa_menos_161)
#mapview(condados_costa_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)

filtro_condados_menos_161 <- function(data_frame_dist_min_por_grupo_condado, umbral) {
  i <- 1
  n <- nrow(data_frame_dist_min_por_grupo_condado_costa)
  nombre_condados <- c()
  dist <- c()
  lon <- c()
  lat <- c()
  estado <- c()
  
  k <- 1             # la dimension de la salida es menor que la de la base "data_frame_dist_min_por_grupo_condado_costa", por eso se usa k
  
  while (i <= n) {   # las iteraciones se acaban hasta checar todas las filas de data_frame_dist_min_por_grupo_condado_costa)
    
    if(data_frame_dist_min_por_grupo_condado[i, 3] <= umbral) 
      
    {
      
      dist[k] <- data_frame_dist_min_por_grupo_condado[i, 3]
      
      nombre_condados[k] <- data_frame_dist_min_por_grupo_condado[i, 2]
      
      lon[k] <- data_frame_dist_min_por_grupo_condado[i, 4]
      
      lat[k] <- data_frame_dist_min_por_grupo_condado[i, 5]
      
      estado[k] <- data_frame_dist_min_por_grupo_condado[i, 1]
      
      k <- k + 1
      
    }
    
    else{k <- k} 
    
    i <- i + 1    
    
  }
  
  return(data.frame(estado, nombre_condados, dist, lon, lat))
  
  
}
condados_costa_menos_161 <- filtro_condados_menos_161(data_frame_dist_min_por_grupo_condado_costa, umbral) 
dim(condados_costa_menos_161)
## [1] 34  5
mapview(condados_costa_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)

STEP 3. CREAR LOS PUNTOS EN EL GOLFO DE MEXICO TEXAS 3.1.1. CREAR LOS PUNTOS DE LA COSTA DE TEXAS

puntos_costa_este <- data.frame(long = c(-97.15759, -97.44392, -97.56340, -97.38281, -97.11502, -96.40709, -95.48801, -94.91089, -93.87886),
                                lat = c(25.95866, 26.43615, 26.93676, 27.41444, 27.95195, 28.44515, 28.83355, 29.35525, 29.68209))

mapview(puntos_costa_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_costa_este <- funcion_punto_medio_frontera(puntos_costa_este) 

mapview(puntos_costa_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos <- paste("punto", 1:nrow(puntos_costa_este), sep = "")

puntos_costa_este <- cbind(puntos, puntos_costa_este)

CALCULAR LAS DISTANCIAS ENTRE LA COSTA DE TEXAS Y LOS CONDADOS DE TEXAS condados TX = 254 puntos_costa_este = 17

dist_costa_TX <- Distancia_cada_checkpoint_cada_condado3(condados_TX, puntos_costa_este)


dim(dist_costa_TX)
## [1] 4318    6

3.1.3. CALCULATE THE MINIMUM DISTANCES OF THE EAST COAST POINTS FROM TEXAS

dist_min_por_grupo_condado_TX <- function(dist_todos_condados_todos_pb) { 
  
  i <- 1
  # num_condados <- length(unique(dist_todos_condados_todos_pb$condado))  
  num_condados <- 254 # son 254 condados de Texas
  num_pb <- length(unique(dist_todos_condados_todos_pb[, 3]))
  dist <- c()
  nombre_condados <- c()
  lon <- c()
  lat <- c()     # la salida tiene que ser de la misma dimension que el numero de i (es decir de condados)
  estado <- c()
  
  li <- 0        
  ls <- num_pb
  
  while (i <= num_condados) {
    
    li <- li + 1              # es para que, en la segunda iteracion, la fila sea 23 y no 22 
    
    distancias <- dist_todos_condados_todos_pb[li:ls, 4]            ## 22 distancias en cada iteracion
    
    dist_min_funcion <- min(distancias) 
    
    posicion <- which(dist_min_funcion == dist_todos_condados_todos_pb[, 4]) ## da la posicion del valor minimo 
    
    #print(posicion)
    
    nombre_condados[i] <- dist_todos_condados_todos_pb[posicion, 2] 
    
    lon[i] <- dist_todos_condados_todos_pb[posicion, 5] 
    
    lat[i] <- dist_todos_condados_todos_pb[posicion, 6]
    
    dist[i] <- dist_min_funcion
    
    estado[i] <- dist_todos_condados_todos_pb[posicion, 1]
    
    li <- ls 
    
    i <- i + 1       # construyo la i + 1 antes de ls (abajo) porque ls depende de i
    
    ls <- i * num_pb # es la ls de cada bloque. para el bloque 1, es i * 22 = 1 * 22  = 22. Para el 2ndo bloque, es i * 22 = 2 * 22 = 44
    
  }
  return(data.frame(estado, nombre_condados, dist, lon, lat))
}
dist_min_por_grupo_condado_TX_2 <- dist_min_por_grupo_condado_TX(dist_costa_TX)

dim(dist_min_por_grupo_condado_TX_2)
## [1] 254   5

3.1.3. FILTER POINTS OF LESS THAN 161 MILES ON THE TEXAS COAST

dist_TX_menos_161 <- dist_min_por_grupo_condado_TX_2 %>% filter(dist <= 161)
head(dist_TX_menos_161)
##   estado nombre_condados      dist       lon      lat
## 1  texas         aransas  19.02828 -96.95149 28.23596
## 2  texas          austin 136.97136 -96.28069 29.89024
## 3  texas             bee  80.57762 -97.74272 28.41994
## 4  texas        brazoria  29.12503 -95.46681 29.21466
## 5  texas          brooks  66.48372 -98.22452 27.03885
## 6  texas         calhoun  29.38509 -96.69405 28.52403
dim(dist_TX_menos_161)
## [1] 46  5
mapview(dist_TX_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)

3.2. LOUISIANA

3.2.1. CREATE LOUISIANA POINTS

condados_louisiana <- geoCounty %>% filter(rMapState == "louisiana")

mapview(condados_louisiana, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
puntos_louisiana <- data.frame(long = c(-93.70398,-89.64054), 
                               lat = c(29.74172, 30.16294))

puntos_louisiana
##        long      lat
## 1 -93.70398 29.74172
## 2 -89.64054 30.16294
mapview(puntos_louisiana, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_louisiana <- funcion_punto_medio_frontera(puntos_louisiana)

mapview(puntos_louisiana, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_louisiana <- data.frame(long = c(-93.70398,-89.64054), 
                               lat = c(29.74172, 30.16294))



puntos_louisiana <- data.frame(long = c(-93.70398, -91.67336, -89.64054), 
                               lat = c(29.74172, 29.74560, 30.16294))

puntos_louisiana <- funcion_punto_medio_frontera(puntos_louisiana)

mapview(puntos_louisiana, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_louisiana <- data.frame(long = c(-93.70398, -92.69646, -91.67336, -90.56442, -89.64054), 
                               lat = c(29.74172, 29.60988, 29.74560, 29.43362, 30.16294))

nombres_puntos <- paste("punto", 1:nrow(puntos_louisiana), sep="")
nombres_puntos
## [1] "punto1" "punto2" "punto3" "punto4" "punto5"
puntos_louisiana <- data.frame(nombres_puntos, puntos_louisiana)
puntos_louisiana
##   nombres_puntos      long      lat
## 1         punto1 -93.70398 29.74172
## 2         punto2 -92.69646 29.60988
## 3         punto3 -91.67336 29.74560
## 4         punto4 -90.56442 29.43362
## 5         punto5 -89.64054 30.16294
dim(puntos_louisiana)
## [1] 5 3
mapview(puntos_louisiana, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)

3.2.2. CALCULATE THE DISTANCES BETWEEN LOUISIANA COAST AND LOUISIANA COUNTIES

dim(puntos_louisiana) # 5 puntos frontera Louisiana
## [1] 5 3
dim(condados_louisiana) # 64 condados de Louisiana
## [1] 64  7
dist_condados_louisiana_costa_louisiana <- Distancia_cada_checkpoint_cada_condado3(condados_louisiana, puntos_louisiana)
dim(dist_condados_louisiana_costa_louisiana)
## [1] 320   6

3.2.3. CALCULATE THE MINIMUM DISTANCES BETWEEN LOUISIANA COAST AND LOUISIANA COUNTIES

dist_min_por_grupo_condado <- function(dist_todos_condados_todos_pb, num_condados) { 
  
  i <- 1
  # num_condados <- length(unique(dist_todos_condados_todos_pb$condado))
  num_pb <- length(unique(dist_todos_condados_todos_pb[, 3]))
  dist <- c()
  nombre_condados <- c()
  lon <- c()
  lat <- c()     # la salida tiene que ser de la misma dimension que el numero de i (es decir de condados)
  estado <- c()
  
  li <- 0        
  ls <- num_pb
  
  while (i <= num_condados) {
    
    li <- li + 1              # es para que, en la segunda iteracion, la fila sea 23 y no 22 
    
    distancias <- dist_todos_condados_todos_pb[li:ls, 4]            ## 22 distancias en cada iteracion
    
    dist_min_funcion <- min(distancias) 
    
    posicion <- which(dist_min_funcion == dist_todos_condados_todos_pb[, 4]) ## da la posicion del valor minimo 
    
    #print(posicion)
    
    nombre_condados[i] <- dist_todos_condados_todos_pb[posicion, 2] 
    
    lon[i] <- dist_todos_condados_todos_pb[posicion, 5] 
    
    lat[i] <- dist_todos_condados_todos_pb[posicion, 6]
    
    dist[i] <- dist_min_funcion
    
    estado[i] <- dist_todos_condados_todos_pb[posicion, 1]
    
    li <- ls 
    
    i <- i + 1       # construyo la i + 1 antes de ls (abajo) porque ls depende de i
    
    ls <- i * num_pb # es la ls de cada bloque. para el bloque 1, es i * 22 = 1 * 22  = 22. Para el 2ndo bloque, es i * 22 = 2 * 22 = 44
    
  }
  return(data.frame(estado, nombre_condados, dist, lon, lat))
}
num_condados_louisiana <- nrow(condados_louisiana)

dist_min_louisiana <- dist_min_por_grupo_condado(dist_condados_louisiana_costa_louisiana, num_condados_louisiana)

3.2.4. FILTER LOUISIANA COUNTIES TO THOSE WITH LESS THAN 200 KM FROM THE COAST

condados_louisiana_menos_161 <- dist_min_louisiana %>% filter(dist <= 161)
dim(condados_louisiana_menos_161)
## [1] 37  5
mapview(condados_louisiana_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)

STEP 4 THE OTHER POINTS OF THE EAST COAST (Atlantic) The border patrol is coastal, so we create the border points of the Atlantic East Coast 4.1. CREATE THE POINTS OF THE EAST COAST

puntos_extremos_este <- data.frame(long = c(-89.53308, -67.12646), lat = c(30.18015, 44.73113)) 

mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_extremos_este <- funcion_punto_medio_frontera(puntos_extremos_este)

## Como es una linea recta, reubicamos los puntos hacia la costa:

puntos_extremos_este <- data.frame(long = c(-89.53308, -75.97046, -67.12646), lat = c(30.18015, 36.78289, 44.73113)) 

puntos_extremos_este <- funcion_punto_medio_frontera(puntos_extremos_este)

mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_extremos_este <- data.frame(long = c(-89.53308, -80.49408, -75.97046, -72.10327, -67.12646), 
                                   lat = c(30.18015, 32.30803, 36.78289, 41.31289, 44.73113)) 


puntos_extremos_este <- funcion_punto_medio_frontera(puntos_extremos_este)

mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_extremos_este <- data.frame(long = c(-89.53308, -84.85291, -80.49408, -77.84088, -75.97046, -74.49348, -72.10327, -70.60638, -67.12646), 
                                   lat = c(30.18015, 29.75961, 32.30803, 34.15386, 36.78289, 39.33005, 41.31289, 43.17314, 44.73113)) 

Add middle points:

puntos_extremos_este <- funcion_punto_medio_frontera(puntos_extremos_este)

mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)

Relocate:

puntos_extremos_este <- data.frame(long = c(-89.53308, -87.23557, -84.85291, -80.80994, -80.49408, -79.1814178, -77.84088, -76.49643, -75.97046, -75.34355, -74.49348, -73.97781, -72.10327, -70.76157, -70.60638, -69.12598, -67.12646), 
                                   lat = c(30.18015, 30.39657, 29.75961, 28.57005, 32.30803, 33.238087, 34.15386, 35.26580, 36.78289, 38.08809, 39.33005, 40.33241, 41.31289, 42.23055, 43.17314, 44.01998, 44.73113)) 

puntos_extremos_este <- funcion_punto_medio_frontera(puntos_extremos_este)

mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
dim(puntos_extremos_este)
## [1] 33  2

Relocate:

puntos_extremos_este <- data.frame(long = c(-89.53308, -88.39050, -87.23557, -86.03668, -84.85291, -82.82181, -80.80994, -81.42242, -80.49408, -79.83370, -79.1814178, 
                                            -78.55911, -77.84088, -77.11844, -76.49643, -76.24168, -75.97046, -75.77682, -75.34355, -75.07456, -74.49348, -74.15462, -73.97781, 
                                            -73.02612, -72.10327, -71.37817, -70.76157, -70.79693, -70.60638, -70.21122, -69.12598, -68.10150, -67.12646),
                                   
                                   lat =  c(30.18015, 30.37761, 30.39657, 30.27804, 29.75961, 29.15336, 28.57005, 30.44394, 32.30803, 32.75855, 33.238087, 
                                            33.84903, 34.15386, 34.68708, 35.26580, 36.10404, 36.78289, 37.49338, 38.08809, 38.71311, 39.33005, 39.83220, 40.33241, 
                                            40.74414, 41.31289, 41.66932, 42.23055, 42.70136, 43.17314, 43.61346, 44.01998, 44.38178, 44.73113)) 


dim(puntos_extremos_este)
## [1] 33  2
mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_nombres <- paste("punto", 1:nrow(puntos_extremos_este), sep = "")

puntos_extremos_este <- data.frame(puntos_nombres, puntos_extremos_este)

4.1. CALCULATE THE DISTANCES FROM THE COAST

#freq(geoCounty, "rMapState", plot = FALSE)

states <- c( "louisiana", "mississippi", "alabama", "florida", "georgia", "south carolina", "north carolina",
             "maryland", "virginia", "delaware", "pennsylvania", "new jersey", "connecticut", "massachusetts",
             "maine", "new hampshire", "new york")



estados_costa_este <- geoCounty %>% filter(rMapState %in% states) # vienen todos los condados tambien
dim(estados_costa_este)
## [1] 910   7
dist_costa_condados_costa_este <- Distancia_cada_checkpoint_cada_condado3(estados_costa_este, puntos_extremos_este)


dim(dist_costa_condados_costa_este)
## [1] 30030     6

4.2. CALCULAR THE MINIMUM DISTANCES

dist_minima_costa_este <- dist_min_por_grupo_condado(dist_costa_condados_costa_este, nrow(estados_costa_este))

dim(dist_minima_costa_este)  #910
## [1] 910   5
head(dist_minima_costa_este)
##    estado nombre_condados      dist       lon      lat
## 1 alabama         autauga 244.82606 -86.64565 32.54009
## 2 alabama         baldwin  60.42531 -87.72627 30.73831
## 3 alabama         barbour 187.62019 -85.39733 31.87403
## 4 alabama            bibb 289.56814 -87.12526 32.99902
## 5 alabama          blount 404.60190 -86.56271 33.99044
## 6 alabama         bullock 205.56141 -85.71680 32.10634

4.3. FILTRER THE DISTANCES WITH LESS THAN 161 KM

condados_costa_este_menos_161 <- dist_minima_costa_este %>% filter(dist <= 161)

dim(condados_costa_este_menos_161)
## [1] 333   5
mapview(condados_costa_este_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
toda_costa_este_menos_161 <- rbind(condados_costa_este_menos_161, 
                                   condados_louisiana_menos_161, 
                                   dist_TX_menos_161)

dim(toda_costa_este_menos_161)
## [1] 416   5
mapview(toda_costa_este_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)

STEP 5 JOINT ALL AT-RISK COUNTIES (FAILURE)

conjunto_condados_menos_161_ <- rbind(condados_frontera_menos_161,    # 49
                                      condados_costa_menos_161,       # 34
                                      condados_costa_este_menos_161,  # 333
                                      dist_TX_menos_161,              # 46
                                      condados_louisiana_menos_161)   # 37

dim(conjunto_condados_menos_161_)
## [1] 499   5
mapview(conjunto_condados_menos_161_, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
dim(conjunto_condados_menos_161_)
## [1] 499   5
head(conjunto_condados_menos_161_)
##       estado nombre_condados      dist       lon      lat
## 1 california        imperial  43.44225 -115.3751 33.04472
## 2 california          orange 144.04868 -117.7533 33.71696
## 3 california       riverside 129.54921 -116.0093 33.74562
## 4 california       san diego  62.20824 -116.7202 33.04015
## 5    arizona         cochise  83.25116 -109.7629 31.88631
## 6    arizona            pima  79.92557 -111.8002 32.10501

CHECK IF THE DUPLICATES WERE REMOVED

distinct_conjunto <- conjunto_condados_menos_161_ %>% distinct(lon, lat, .keep_all = TRUE) 
head(distinct_conjunto)
##       estado nombre_condados      dist       lon      lat
## 1 california        imperial  43.44225 -115.3751 33.04472
## 2 california          orange 144.04868 -117.7533 33.71696
## 3 california       riverside 129.54921 -116.0093 33.74562
## 4 california       san diego  62.20824 -116.7202 33.04015
## 5    arizona         cochise  83.25116 -109.7629 31.88631
## 6    arizona            pima  79.92557 -111.8002 32.10501
dim(distinct_conjunto)
## [1] 468   5
#468
mapview(distinct_conjunto, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)  # base limpia