我对R来说相当新,所以我想提前告知最终没有选择最好的词来解释我的问题。
我的问题是我想要从具有多个列的数据集(旧)中创建一个子集。到目前为止没问题......
我的子集应该在其中一个列中的值(x)达到其最高点时开始;并在x再次下降到最低点后立即停止。 然后使用此数据子集(旧)创建一个新数据集(新)。
由于我的原始数据集(旧)中存在多个位置,其中值x的行为如上所述,我想为我创建的每个子集创建一个新的数据集(new1,new2,new ....)
我希望我想说的是清楚的。如果需要更多信息,我很乐意提供。
非常感谢你的帮助。
答案 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.framesplit(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