【问题标题】:Using a zero-crossing algorithm with a vector使用带有向量的过零算法
【发布时间】:2021-11-24 13:49:13
【问题描述】:

我在使用过零算法时遇到了一些问题。 假设我们有这个数据集:

time <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
x <- c(1,2,3,-2 -4,-8,-2,0,1,2,3,4,2,1,-3,-4,-7,-4,-1,1,2)
df <- data.frame(time, x)
df

我需要在 R 中编写一个函数,在 df 中创建一个新列,指示 X 何时从正变为负:

0 表示没有过零, 1 过零。

应该很容易做到,但目前还没有找到解决办法。

对我有什么建议吗?

最好的问候

【问题讨论】:

    标签: r zerocrossing


    【解决方案1】:

    查找符号为负(第一个条件)和前位置为正(第二个条件)的行:

    df$pass <- ifelse(sign(df$x) < 0  & lag(sign(df$x)) >= 0, 1, 0)
    

    【讨论】:

      【解决方案2】:

      你可以试试下面的代码

      transform(
        df,
        crosszero = c(+(rowSums(embed(sign(x), 2)) == 0 & head(x, -1) > 0), NA)
      )
      

      给了

         time  x crosszero
      1     1  1         0
      2     2  2         0
      3     3  3         1
      4     4 -6         0
      5     5 -8         0
      6     6 -2         0
      7     7  0         0
      8     8  1         0
      9     9  2         0
      10   10  3         0
      11   11  4         0
      12   12  2         0
      13   13  1         1
      14   14 -3         0
      15   15 -4         0
      16   16 -7         0
      17   17 -4         0
      18   18 -1         0
      19   19  1         0
      20   20  2        NA
      

      【讨论】:

      • 谢谢。这里在time=18时有一点错误
      • @piravi 抱歉,我误读了您的帖子。您只想检查从正到负的交叉。我更新了我的答案。
      • 非常感谢!
      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2021-02-21
      • 1970-01-01
      相关资源
      最近更新 更多