如何在子集中创建启动/停止条件?

时间:2014-03-26 13:42:54

标签: r

我对R来说相当新,所以我想提前告知最终没有选择最好的词来解释我的问题。

我的问题是我想要从具有多个列的数据集(旧)中创建一个子集。到目前为止没问题......

我的子集应该在其中一个列中的值(x)达到其最高点时开始;并在x再次下降到最低点后立即停止。 然后使用此数据子集(旧)创建一个新数据集(新)。

由于我的原始数据集(旧)中存在多个位置,其中值x的行为如上所述,我想为我创建的每个子集创建一个新的数据集(new1,new2,new ....)

我希望我想说的是清楚的。如果需要更多信息,我很乐意提供。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

例如,如果你有

x <- c(5,4,3,2,1,2,3,4,5,4,3,2,1,2,3,2,1)

然后

direction <- sign(diff(x))

将给出一系列+ 1s和-1s,表示x是向上还是向下摆动。我们只对向下波动感兴趣,所以让我们用NA标记向上点,用n号向下标记第n个向下点:

run <- rle(direction)
run$values[run$values==1] <- NA
run$values[!is.na(run$values)] <- 1:sum(!is.na(run$values))

现在看来你想要在一系列向下点中包含最后一个点(符号为正数,因为向下运行中最后一个点之后的点更高)。所以我们需要延长向下运行的长度,并减少向上运行:

run$lengths <- run$lengths + ifelse(is.na(run$values), -1, +1)
swing <- inverse.rle(run)
plot(x, col=swing)

颜色向下应以不同颜色运行,并省略向上运行。您现在已经有一个标记运行的变量,您可以通过

拆分data.frame
split(myDataFrame, swing)

如果我们在向上或向下开始/结束a,您可能需要检查这是否有效

答案 1 :(得分:0)

这是一个选项,我们检查方向何时随diff变化,然后沿着它分开。首先,制作一些数据:

df <- data.frame(x=rep(c(1:3, 2:1), 3))

然后:

dir.vec <- c(diff(df$x) <= 0, tail(diff(df$x) <= 0, 1)) # has drop started?
split.vec <- cumsum(c(0, diff(dir.vec)) < 0)            # which drop # is this?
split(df[dir.vec,,drop=F], split.vec[dir.vec])          # split drops by drop num

原件:

   x
1  1
2  2
3  3
4  2
5  1
6  1
7  2
8  3
9  2
10 1
11 1
12 2
13 3
14 2
15 1

分割:

$`0`
  x
3 3
4 2
5 1

$`1`
   x
8  3
9  2
10 1

$`2`
   x
13 3
14 2
15 1