对向量使用过零算法
Using a zero-crossing algorithm with a vector
我的过零算法有一些问题。
假设我们有这个数据集:
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 个过零。
应该很容易做,但目前我还没有找到解决办法。
对我有什么建议吗?
此致
查找符号为负(第一个条件)且在之前位置为正(第二个条件)的行:
df$pass <- ifelse(sign(df$x) < 0 & lag(sign(df$x)) >= 0, 1, 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
我的过零算法有一些问题。 假设我们有这个数据集:
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 个过零。
应该很容易做,但目前我还没有找到解决办法。
对我有什么建议吗?
此致
查找符号为负(第一个条件)且在之前位置为正(第二个条件)的行:
df$pass <- ifelse(sign(df$x) < 0 & lag(sign(df$x)) >= 0, 1, 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