Если зонд выходит из строя только во время понижения, т. Е. Нет такого случая, когда
глубина (i)> глубина (i + 1)
для ячеек, принадлежащих одному и тому же downcast, тогда этот код работает.
Он считает, что когда глубина ячейки меньше глубины ее предыдущей - см. документы для diff (x) - downcast закончился , Поэтому, возможно, вы захотите продезинфицировать свою дату перед использованием. Я установил список температур, чтобы продемонстрировать, как расширить использование других параметров.
## create test data for depth "Z" and temperature "T"
dc1.Z <- seq(10,100,1)
dc1.T <- seq(15, 3, length.out=length(dc1.Z))
dc2.Z <- seq(10,90,1)
dc2.T <- seq(18, 1, length.out=length(dc2.Z))
dc3.Z <- seq(20,80,1)
dc3.T <- seq(10, 2, length.out=length(dc3.Z))
dc4.Z <- seq(10,95,1)
dc4.T <- seq(15, 5, length.out=length(dc4.Z))
## join data as specified
dc.Z <- c(dc1.Z, dc2.Z, dc3.Z, dc4.Z)
dc.T <- c(dc1.T, dc2.T, dc3.T, dc4.T)
## get indexes for points where depth increases
## the 'plus one' is to target the first values of a downcast
## instead of the last ones, so splitAt will work properly
indexes <- which(diff(dc.Z) < 0) + 1
## define function for spliting a list at given indexes and use it
splitAt <- function(x, pos) unname(split(x, cumsum(seq_along(x) %in% pos)))
splited.dc.Z <- splitAt(dc.Z, indexes)
splited.dc.T <- splitAt(dc.T, indexes)
## check if each of the splited values match the original
all(dc1.Z == splited.dc.Z[[1]])
all(dc1.T == splited.dc.T[[1]])
all(dc2.Z == splited.dc.Z[[2]])
all(dc2.T == splited.dc.T[[2]])
all(dc3.Z == splited.dc.Z[[3]])
all(dc3.T == splited.dc.T[[3]])
all(dc4.Z == splited.dc.Z[[4]])
all(dc4.T == splited.dc.T[[4]])
Я получил функцию splitAt
от на этот вопрос