我从海洋学设备的部署中获得了一些海洋学数据(时间,深度,浮游生物计数,盐度,温度等)。部署由水柱的多个剖面组成。我将数据中的所有向下转换子集化(当设备下降时),以便在绘制深度随时间变化时,数据如下所示:depth over time。
我可以在R中使用哪些代码或函数来自动识别,隔离和提取来自每个单独下调的数据到其自己的对象中(而不必专门标识每个下传的时间)?对于图中的数据,它将实质上生成6个对象。理想情况下,该代码可以轻松地应用于其他部署,每个部署都具有1-7个下调。
我一直在寻找确定数据断点或结构更改的方法,但是没有什么能取得成果。谢谢!
[如果仅在向下转换期间探针下降,即没有这种情况,则>]
深度(i)>深度(i + 1)
对于属于相同下行通道的小区,此代码有效。
[它认为,当一个单元格的深度小于其前一个单元格的深度时-请参阅diff(x)文档-向下转换已结束。因此,在使用此功能之前,您可能需要清理日期。我设置了一个温度列表,以演示如何扩展其他参数的使用范围。
## 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 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
获得了函数this question