R/station.R

Defines functions station.gulf.set station

Documented in station station.gulf.set

#' @title Sampling Station Numbering
#'
#' @description Functions to extract or determine trawl sampling station identification numbers.
#'              A sampling station is to be interpreted as a particular location, e.g. if two tows share
#'              a station number they can be considered as having been sampled in the same location.
#'              Station numbers can be assigned or determined based on spatial proximity.
#'
#' @param x Data object.
#' @param method Character string specifying the method to determine the station number. Options are \sQuote{observed} and \sQuote{calculated}.
#' @param distance.tolerance Distance (in kilometers) below which a pair of points is considered to belong to the same sampling station.
#' @param time.tolerance Numeric value specifying the time-difference below which a pair of points is considered to have occured at the same time.
#' @param ... Other arguments (not used).

#' @export
station <- function(x, ...) UseMethod("station")

#' @export station.number
station.number <- station

#' @describeIn station Return survey sampling station identifier.
#' @rawNamespace S3method(station,gulf.set)
station.gulf.set <- function(x, method = "observed", distance.tolerance = 2, time.tolerance = 10, ...){
   # Check 'method' argument:
   method <- match.arg(tolower(method), c("observed", "calculated"))

   # Define 'cruise' variable:
   cruise <- paste(x$vessel.code, x$cruise.number, sep = "")

   # Initialize result vector:
   v <- rep(NA, nrow(x))

   # Assign station numbers based on SAS program:
   if (method == "observed"){
      if (all(gulf.metadata::project(x) == "rvs")){
         v <- x$set.number
         v[is.na(v)] <- x$set.number[is.na(v)]
         
         # 1984: 4 repeat stations (checked visually on a map)
         ix <- (cruise == "P312")
         temp <- c(302, 202,
                   402, 202,
                   306, 206,
                   309, 209,
                   310, 210,
                   410, 210)
         from <- temp[seq(1, length(temp), by = 2)]
         to <- temp[seq(2, length(temp), by = 2)]
         s <- match(x$set.number[ix], from)
         v[ix][!is.na(s)] <- to[s[!is.na(s)]]
         
         # Repeat sets for 1983, 1985, 1986 and 1987:
         ix <- cruise %in% c("P296", "P327", "H141", "H159", "H179")
         if (sum(ix) > 0){
            v[ix & (x$set.number %in% c(203))] <- 3
            v[ix & (x$set.number %in% c(229))] <- 29
            v[ix & (x$set.number %in% c(233, 333))] <- 33
            v[ix & (x$set.number %in% c(235, 335))] <- 35
            v[ix & (x$set.number %in% c(237))] <- 37
            v[ix & (x$set.number %in% c(238))] <- 38
            v[ix & (x$set.number %in% c(243))] <- 43
            v[ix & (x$set.number %in% c(250))] <- 50
            v[ix & (x$set.number %in% c(251))] <- 51
            v[ix & (x$set.number %in% c(-54, seq(254, 954, by = 100)))] <- 54
            v[ix & (x$set.number %in% c(255))] <- 55
            v[ix & (x$set.number %in% seq(256, 956, by = 100))] <- 56
            v[ix & (x$set.number %in% seq(257, 857, by = 100))] <- 57
            v[ix & (x$set.number %in% c(258))] <- 58
            v[ix & (x$set.number %in% c(259))] <- 59
            v[ix & (x$set.number %in% c(260))] <- 60
            v[ix & (x$set.number %in% c(261))] <- 61
            v[ix & (x$set.number %in% c(269))] <- 69
            v[ix & (x$set.number %in% c(275))] <- 75
            v[ix & (x$set.number %in% c(281, 381))] <- 81
            v[ix & (x$set.number %in% c(282, 382))] <- 82
            v[ix & (x$set.number %in% c(285, 385))] <- 85
            v[ix & (x$set.number %in% c(290))] <- 90
            v[ix & (x$set.number %in% c(291, 391))] <- 91
            v[ix & (x$set.number %in% c(294))] <- 94
            v[ix & (x$set.number %in% c(211))] <- 111
            v[ix & (x$set.number %in% c(212, 512, 612))] <- 112
            v[ix & (x$set.number %in% c(513, 613))] <- 113
            v[ix & (x$set.number %in% c(214))] <- 114
            v[ix & (x$set.number %in% c(520))] <- 120
            v[ix & (x$set.number %in% c(239))] <- 139
            v[ix & (x$set.number %in% c(541))] <- 141
            v[ix & (x$set.number %in% c(542))] <- 142
         }
         
         # 1988: Repeat sets galore.
         ix <- (cruise == "H192")
         temp <- c( 30,  27,
                    5,   7,
                    150, 146,
                    147, 143,
                    148, 144,
                    149, 145,
                    100,  97,
                    109, 103,
                    115, 114,
                    118, 110,
                    116, 112,
                    117, 111,
                    107, 101,
                    129, 122,
                    128, 121,
                    108, 102,
                    119, 120,
                    141, 134,
                    132, 126,
                    131, 125,
                    130, 124,
                    127, 123,
                    138, 137,
                    140, 135,
                    139, 136,
                    86,  81,
                    98,  94,
                    90,  85,
                    91,  92,
                    87,  82,
                    88,  83,
                    37,  34,
                    89,  84,
                    151, 154,
                    158, 157,
                    159, 156,
                    160, 155,
                    47,  44,
                    161, 163,
                    152, 153,
                    39,  41,
                    40,  42,
                    28,  25,
                    21,  24,
                    19,  23,
                    29,  26,
                    14,  17,
                    18,  22,
                    77,  76,
                    78,  75,
                    79,  74,
                    73,   1,
                    72,   8,
                    2,   9,
                    3,  10,
                    12,  16,
                    13,  69,
                    49,  52,
                    50,  51,
                    57,  54,
                    46,  53,
                    61,  65,
                    62,  66,
                    59,  56,
                    58,  55,
                    60,  64,
                    48,  45)
         from <- temp[seq(1, length(temp), by = 2)]
         to <- temp[seq(2, length(temp), by = 2)]
         s <- match(x$set.number[ix], from)
         v[ix][!is.na(s)] <- to[s[!is.na(s)]]
         
         # Comparative day-night surveys for 1993:
         ix <- (cruise == "N192")
         temp <- c( 27,  30,
                    5,   7,
                    146, 150,
                    143, 147,
                    144, 148,
                    145, 149,
                    97, 100,
                    103, 109,
                    114, 115,
                    110, 118,
                    112, 116,
                    111, 117,
                    101, 107,
                    122, 129,
                    121, 128,
                    102, 108,
                    119, 120,
                    134, 141,
                    126, 132,
                    125, 131,
                    124, 130,
                    123, 127,
                    137, 138,
                    135, 140,
                    136, 139,
                    81,  86,
                    94,  98,
                    85,  90,
                    91,  92,
                    82,  87,
                    83,  88,
                    34,  37,
                    84,  89,
                    151, 154,
                    157, 158,
                    156, 159,
                    155, 160,
                    44,  47,
                    161, 163,
                    152, 153,
                    39,  41,
                    40,  42,
                    25,  28,
                    21,  24,
                    19,  23,
                    26,  29,
                    14,  17,
                    18,  22,
                    76,  77,
                    75,  78,
                    74,  79,
                    1,  73,
                    8,  72,
                    2,   9,
                    3,  10,
                    12,  16,
                    13,  69,
                    49,  52,
                    50,  51,
                    54,  57,
                    46,  53,
                    61,  65,
                    62,  66,
                    56,  59,
                    55,  58,
                    60,  64,
                    45,  48)
         to <- temp[seq(1, length(temp), by = 2)]
         from <- temp[seq(2, length(temp), by = 2)]
         s <- match(x$set.number[ix], from)
         v[ix][!is.na(s)] <- to[s[!is.na(s)]]
         
         # Comparative day-night surveys for 1998:
         ix <- (cruise == "N846")
         if (sum(ix) > 0){
            v[ix & (x$set.number == 16)]  <- 12
            v[ix & (x$set.number == 17)]  <- 13
            v[ix & (x$set.number == 18)]  <- 14
            v[ix & (x$set.number == 23)]  <- 19
            v[ix & (x$set.number == 25)]  <- 20
            v[ix & (x$set.number == 26)]  <- 21
            v[ix & (x$set.number == 46)]  <- 41
            v[ix & (x$set.number == 47)]  <- 42
            v[ix & (x$set.number == 48)]  <- 43
            v[ix & (x$set.number == 184)] <- 178
            v[ix & (x$set.number == 185)] <- 179
            v[ix & (x$set.number == 186)] <- 180
            v[ix & (x$set.number == 187)] <- 181
            v[ix & (x$set.number == 188)] <- 182
            v[ix & (x$set.number == 189)] <- 183
            v[ix & (x$set.number == 199)] <- 196
            v[ix & (x$set.number == 200)] <- 197
            v[ix & (x$set.number == 201)] <- 198
            v[ix & (x$set.number == 205)] <- 202
            v[ix & (x$set.number == 206)] <- 203
            v[ix & (x$set.number == 207)] <- 204
            v[ix & (x$set.number == 211)] <- 208
            v[ix & (x$set.number == 214)] <- 210
            v[ix & (x$set.number == 215)] <- 209
            v[ix & (x$set.number == 216)] <- 212
            v[ix & (x$set.number == 217)] <- 213
         }
       
         # Comparative day-night surveys for 1999:
         ix <- (cruise == "N941")
         temp <- c(  2,   5,
                     1,   6,
                     3,   7,
                     4,   9,
                     20,  25,
                     21,  26,
                     23,  27,
                     24,  28,
                     37,  42,
                     35,  43,
                     174, 177,
                     175, 178,
                     176, 179,
                     184, 188,
                     185, 189,
                     186, 190,
                     193, 198,
                     196, 199,
                     197, 200,
                     194, 201,
                     195, 202)
         to <- temp[seq(1, length(temp), by = 2)]
         from <- temp[seq(2, length(temp), by = 2)]
         s <- match(x$set.number[ix], from)
         v[ix][!is.na(s)] <- to[s[!is.na(s)]]
         
         # Comparative day-night surveys for 2000:
         ix <- (cruise == "N045")
         temp <- c(199, 204,
                   200, 205,
                   201, 206,
                   11,  14,
                   10,  12,
                   197, 202,
                   4,   8,
                   2,   6,
                   195, 196,
                   3,   7,
                   5,   9,
                   29,  34,
                   33,  38,
                   32,  37,
                   30,  35,
                   58,  59,
                   49,  50,
                   57,  60,
                   56,  61,
                   31,  36,
                   198, 203)
         to <- temp[seq(1, length(temp), by = 2)]
         from <- temp[seq(2, length(temp), by = 2)]
         s <- match(x$set.number[ix], from)
         v[ix][!is.na(s)] <- to[s[!is.na(s)]]
         
         # Comparative survey in 2004:
         ix <- (cruise == "T434")
         temp <- c(7,   2,
                   6,   3,
                   16,  7,
                   18,  9,
                   139, 99,
                   141, 98,
                   136, 104,
                   147, 96,
                   137, 103,
                   146, 97,
                   134, 105,
                   124, 106,
                   126, 113,
                   132, 108,
                   127, 110,
                   129, 111,
                   117, 21,
                   154, 95,
                   113, 19,
                   181, 15,
                   182, 17,
                   175, 20,
                   179, 18,
                   10,  4,
                   5,   5,
                   19,  10,
                   20,  12,
                   12,  6,
                   22,  13,
                   23,  14)
         from <- temp[seq(1, length(temp), by = 2)]
         to   <- temp[seq(2, length(temp), by = 2)]
         s <- match(x$set.number[ix], from)
         v[ix][!is.na(s)] <- to[s[!is.na(s)]]
         
         # Comparative survey in 2005:
         ix <- (cruise == "T507")
         temp <- c(121, 221,
                   135, 235,
                   136, 236,
                   137, 237,
                   138, 238,
                   139, 239,
                   140, 240,
                   141, 241,
                   142, 242,
                   143, 243)
         from <- temp[seq(1, length(temp), by = 2)]
         to <- temp[seq(2, length(temp), by = 2)]
         s <- match(x$set.number[ix], from)
         v[ix][!is.na(s)] <- to[s[!is.na(s)]]
         
         # Comparative survey in 2021:
         ix <- (cruise == "C222")
         temp <- c(87, 110,
                   95, 117,
                   160, 183,
                   161, 184,
                   159, 182,
                   149, 172,
                   148, 170,
                   147, 169,
                   19, 11,
                   17, 13,
                   18, 14,
                   26, 40,
                   25, 39,
                   27, 41,
                   40, 56,
                   38, 53,
                   32, 48,
                   61, 78,
                   62, 79,
                   63, 80,
                   64, 81,
                   65, 82,
                   69, 86,
                   56, 73,
                   58, 75,
                   60, 77,
                   72, 89,
                   74, 91,
                   71, 88,
                   68, 85,
                   67, 84,
                   15, 37,
                   81, 103,
                   82, 104,
                   49, 65,
                   78, 98,
                   84, 107,
                   85, 108,
                   76, 95,
                   75, 93,
                   42, 58,
                   43, 59,
                   44, 60,
                   51, 67,
                   50, 66,
                   53, 69,
                   54, 70,
                   55, 71,
                   2, 22,
                   45, 61,
                   47, 63,
                   16, 38,
                   9, 30,
                   79, 101,
                   80, 102,
                   92, 114,
                   93, 115,
                   90, 113,
                   89, 112,
                   94, 116,
                   86, 109,
                   88, 111,
                   105, 127,
                   106, 128,
                   98, 120,
                   99, 121,
                   97, 119,
                   96, 118,
                   157, 180,
                   156, 179,
                   150, 173,
                   146, 168,
                   145, 167,
                   144, 166,
                   151, 174,
                   153, 176,
                   152, 175,
                   154, 177,
                   155, 178,
                   111, 133,
                   110, 132,
                   104, 126,
                   109, 131,
                   107, 129,
                   141, 163,
                   139, 161,
                   140, 162,
                   114, 136,
                   113, 135,
                   102, 124,
                   103, 125,
                   122, 144,
                   115, 137,
                   132, 154,
                   133, 155,
                   112, 134,
                   124, 146,
                   129, 151,
                   131, 153,
                   130, 152,
                   136, 158,
                   138, 160,
                   120, 142,
                   123, 145,
                   126, 148,
                   119, 141,
                   121, 143,
                   125, 147,
                   128, 150,
                   127, 149,
                   162, 185,
                   41, 57,
                   33, 49,
                   70, 87,
                   100, 122,
                   143, 165,
                   158, 181,
                   137, 159,
                   116, 138,
                   134, 156,
                   142, 164,
                   34, 51,
                   39, 54,
                   66, 83,
                   5, 26,
                   11, 32,
                   163, 186,
                   101, 123,
                   135, 157,
                   118, 140)
         from <- temp[seq(1, length(temp), by = 2)]
         to <- temp[seq(2, length(temp), by = 2)]
         s <- match(x$set.number[ix], from)
         v[ix][!is.na(s)] <- to[s[!is.na(s)]]
         
         # Additionnal station number reassignments:
         ix <- (x$year %in% 1984:1987)
         v[ix & (cruise %in% c("H159", "H179")) & (v == 117)] <- 1017
      
      }else{
         if ("station" %in% names(x)){
            v <- x$station
         }else{
            if ("station.number" %in% names(x)) v <- x$station.number
         } 
      }
   }

   # Group sets using observed coordinates:
   if (method == "calculated"){
      years <- sort(unique(year(x)))
      v <- rep(NA, nrow(x))
      for (i in 1:length(years)){
         ix <- which((year(x) == years[i]) & (x$experiment != 3))
         time <- as.POSIXct(paste0(x[ix, "date"], " ", x[ix, "start.time"]))
         v[ix] <- station(gulf.spatial::longitude(x[ix, ]), gulf.spatial::latitude(x[ix, ]), time = time ,
                          distance.tolerance = distance.tolerance, time.tolerance = time.tolerance)
      }
   }

   return(v)
}
TobieSurette/gulf.data documentation built on Jan. 19, 2025, 7:50 p.m.