2014-03-26 20 views
0

我对R相当陌生,所以我想提前apollogize最终没有选择最好的词来解释我的问题。如何在子集内创建启动/停止条件?

我的问题是,我想创建一个数据集(旧),其中有几个colums的子集。到目前为止没有问题...

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

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

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

非常感谢您的帮助。

+1

的样本数据总是有益的(以具体显示输入期望的输出,并且使得人们更容易修补和修复帮助您找到解决方案)。 –

回答

0

例如如果您有

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

然后

direction <- sign(diff(x)) 

将给予一系列的+1和-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) 

应颜色以不同的颜色向下运行,并且省略向上运行。现在你就是我的标签的运行的变量,并且可以通过

split(myDataFrame, swing) 

分割你的data.frame您可能需要检查这个工作,如果我们开始/上的向上或向下摆动完成a

+0

这解决了我的问题! – user3464299

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