Функция R для определения и извлечения профилей из данных океанографии c? - PullRequest
0 голосов
/ 20 января 2020

У меня есть некоторые данные о океанографии c (время, глубина, количество планктона, соленость, температура и т. Д. c.) Из развертывания оборудования океанографии c. Развертывание состояло из нескольких профилей толщи воды. Я поднастроил все нисходящие значения в данных (когда оборудование снижалось), чтобы при построении графика глубины данные выглядели так: глубина во времени .

Какой код или функцию я могу использовать в R, чтобы автоматически идентифицировать, изолировать и извлекать данные из каждого отдельного отката в свой собственный объект (без необходимости конкретно определять время каждого отката)? Для данных на графике это, по сути, сгенерирует 6 объектов. В идеале код может быть легко применен к другим развертываниям с 1-7 даункастами каждое.

Я пытался определить точки разрыва данных или структурные изменения, но ничего не дало результата. Спасибо !!

1 Ответ

0 голосов
/ 20 января 2020

Если зонд выходит из строя только во время понижения, т. Е. Нет такого случая, когда

глубина (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 от на этот вопрос

...