【问题标题】:R function to identify and extract profiles from oceanographic data?从海洋数据中识别和提取剖面的 R 函数?
【发布时间】:2020-05-06 00:02:41
【问题描述】:

我有一些来自海洋学设备部署的海洋学数据(时间、深度、浮游生物数量、盐度、温度等)。部署包括水柱的多个剖面。我对数据中的所有向下预测进行了子集化(当设备下降时),因此当我绘制随时间变化的深度时,数据如下所示: depth over time

我可以在 R 中使用什么代码或函数来自动识别、隔离和提取每个向下转换的数据到它自己的对象中(无需具体识别每个向下转换的时间)?对于图中的数据,它基本上会生成 6 个对象。理想情况下,代码可以轻松应用于其他部署,每个部署 1-7 次向下转换。

我一直在寻找识别数据断点或结构变化的方法,但没有任何成果。谢谢!!

【问题讨论】:

  • 向下转换之间的空格是否表示为“不是数字”?还是一个向下转换的最后一个数据紧跟在下一个数据的后面?
  • 后者,但我认为我可以将我不想要的原始数据转换为 NAs - 如果这样可以更容易解决这个问题。
  • 我的回答解决了这个问题吗?如果没有,您能指出缺少什么吗?
  • 非常感谢@rvbarreto!这是一个很好的解决方案。我唯一需要更改的是indexes <- c(1, which(diff(dc.Z) < 0) + 1),因为该函数省略了第一个向下转换。

标签: r time-series subset extract breakpoints


【解决方案1】:

如果探测器只在下倾期间下降,即不存在这种情况

深度(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

【讨论】:

  • 非常感谢@rvbarreto!这是一个很好的解决方案。我唯一需要更改的是indexes &lt;- c(1, which(diff(dc.Z) &lt; 0) + 1),因为该函数省略了第一个向下转换。
  • @Gina 我很高兴能够提供帮助。如果我的答案是您正在寻找的,您应该通过单击“v”来接受它。查看此图了解更多信息:i.stack.imgur.com/OGwTL.png
  • 知道了!感谢您的指导:)
  • 欢迎来到stackoverflow!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多