【问题标题】:How to count a change of sign (positive or negative) in vector如何计算向量中符号的变化(正或负)
【发布时间】:2019-11-25 17:11:14
【问题描述】:

我目前正在处理 20 年内大约 40 k km2 的大型数据集中的每日相对积雪值(每 km2),并希望获得在特定时期内积雪增加的天数。每天进行一次测量,因此,相对积雪可能会在几天内增加/减少。

但是,与前几天相比,我很难计算/指出我的每日价值减少/增加的次数。我创建了一些假的(但可能的)数据并计算了元素 n 和元素 n + 1 之间的差异:

set.seed(134)
c <- c(sort(runif(6, 0, 1), decreasing = FALSE),
  sort(runif(10, 0, 1), decreasing = TRUE),
  sort(runif(4, 0, 1), decreasing = FALSE),
  0.9, 0.9, 0.9, sort(runif(3, 0, 1), decreasing = TRUE),
  sort(runif(8, 0, 1), decreasing = FALSE)) # create fake snow cover fraction data
plot(c)
cdiff <- c [1:length(c) - 1] - c [2:length(c)]

然后我想到用符号来表示代数符号

> sign(cdiff)
 [1] 1  1  1  1  1  1  0  1 -1  1  1  1  1  1  1  1  1  1  1 -1 -1 -1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1

我现在有两个问题:

1.) 如何获取代数符号发生变化的新向量的位置

2.) 偶数值可以在 (i) 两个正数、(ii) 两个负数或 (iii) 混合之间找到。在我的示例中,我想将相同的值视为这些值周围的子向量的一部分(在这种情况下:正号但减少积雪分数)。

我的目标是接收一个向量,其中包含与前一天相比值再次变为正数的天数

解决方案不必包含sign(),这正是我认为可能使我更接近解决问题的方法。

提前致谢!

【问题讨论】:

    标签: r vector


    【解决方案1】:

    您可以使用diffwhich找到标志发生变化的位置变为正面的位置。

    #Location where sign changes
    which(diff(sign(diff(c))) != 0)+1
    #[1]  7 16 20 21 23 26
    
    #Turn positive
    which(diff(sign(diff(c))) > 0)+1
    #[1] 16 21 26
    

    或者更强大的find all valleys

    peakPosition <- function(x, inclBorders=TRUE) {
      if(inclBorders) {y <- c(min(x), x, min(x))
      } else {y <- c(x[1], x)}
      y <- data.frame(x=sign(diff(y)), i=1:(length(y)-1))
      y <- y[y$x!=0,]
      idx <- diff(y$x)<0
      (y$i[c(idx,F)] + y$i[c(F,idx)] - 1)/2
    }
    
    peakPosition(-c) #Get valleys
    [1]  1 16 26
    

    【讨论】:

      猜你喜欢
      • 2016-05-16
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      相关资源
      最近更新 更多