0

我对过零算法有一些问题。假设我们有这个数据集:

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 表示过零。

这应该很容易做到,但到目前为止我还没有找到解决方案。

有什么建议给我吗?

此致

4

2 回答 2

0

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

df$pass <- ifelse(sign(df$x) < 0  & lag(sign(df$x)) >= 0, 1, 0)
于 2021-11-24T13:57:43.397 回答
0

你可以试试下面的代码

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
于 2021-11-24T13:57:59.640 回答