R函数从海洋数据中识别和提取剖面图?
R function to identify and extract profiles from oceanographic data?
我有一些来自海洋学设备部署的海洋学数据(时间、深度、浮游生物数量、盐度、温度等)。部署包括水柱的多个配置文件。我将数据中的所有向下转换子集化(当设备下降时),因此当我绘制随时间变化的深度时,数据如下所示:
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
## 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]])
我从 this question
得到函数 splitAt
我有一些来自海洋学设备部署的海洋学数据(时间、深度、浮游生物数量、盐度、温度等)。部署包括水柱的多个配置文件。我将数据中的所有向下转换子集化(当设备下降时),因此当我绘制随时间变化的深度时,数据如下所示: 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
## 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]])
我从 this question
得到函数splitAt