R 从向量中提取递增序列和递减序列

R 从向量中提取递增序列和递减序列,r,sequence,na,difference,R,Sequence,Na,Difference,我有一个包含2718个观测值的数据框,其中一列是感兴趣的。这是使用diff()创建的第一个差异系列。为了方便起见,让我们创建一个与数据相似的伪向量,并假设v是第一个差分序列。引入NAs使其与原始数据相似 # Create fake first difference series vector v v <- runif(2718, -0.05, 0.05) v <- append(NA, diff(v)) # Insert NAs at the beginning and end v

我有一个包含2718个观测值的数据框,其中一列是感兴趣的。这是使用
diff()
创建的第一个差异系列。为了方便起见,让我们创建一个与数据相似的伪向量,并假设
v
是第一个差分序列。引入
NA
s使其与原始数据相似

# Create fake first difference series vector v
v <- runif(2718, -0.05, 0.05)
v <- append(NA, diff(v))

# Insert NAs at the beginning and end
v[c(1:8, 2712:2718)] <- NA

# Insert some NAs at random places in v
ind <- which(v %in% sample(v, 7))
v[ind] <- NA
if
else-if
语句代表第五个要点。我知道当
I
等于
I-1
时,它可以同时作为递增序列和递减序列,并且应该添加到以前存储的任何序列中。我只是不知道如何实现这一点。我认为序列会很短,因为数据很嘈杂,不减少/不增加的周期不会持续很长时间。因此,也可以尝试此操作,例如50/100点移动平均值:

# A symmetric 50 points moving average for v
f50 <- rep(1/51,51)
v_smooth <- filter(v, f50, sides = 2)
我不太明白这里发生了什么,因为
is.na()
语句应该保护
TRUE
FALSE
参数


很高兴听到你的想法

你真的应该尝试一种矢量化的方法,这可能是找到递增或递减序列运行的更清晰的方法:

library(data.table)
data <- as.data.table(v)
data[, vl := shift(v, 1)]
data[, runs := rleid(vl > v)]
库(data.table)
数据(v)]

使用data.table library

您确实应该尝试矢量化方法,这可能是查找递增或递减序列运行的更清晰方法:

library(data.table)
data <- as.data.table(v)
data[, vl := shift(v, 1)]
data[, runs := rleid(vl > v)]
库(data.table)
数据(v)]

使用data.table library

这里尝试回答您的问题(请注意,我稍微更改了您的示例)

#创建伪第一差分序列向量v

v这里尝试回答您的问题(注意,我稍微改变了您的示例)

#创建伪第一差分序列向量v

v你应该矢量化而不是循环,并在差分向量上使用直接条件来创建包含inc和dec的新列。当你想要平滑时,它的工作原理是一样的。以下是一个例子:

library(data.table)
plouf <- setDT(list( v = v, diff = c(NA,diff(v))))
plouf[diff > 0,inc := v]
plouf[diff < 0, dec := v]

f50 <- rep(1/51,51)
plouf[,v_smooth := filter(v, f50, sides = 2)]
plouf[,diff_smooth :=c(NA,diff(v_smooth))]

plouf[diff_smooth > 0,inc_smooth := v_smooth]
plouf[diff_smooth < 0, dec_smooth := v_smooth]

然后,您可以轻松找到最大值或做任何您想做的事情。

您应该矢量化而不是循环,并在差分向量上使用直接条件来创建包含inc和dec的新列。当您想要平滑时,它的工作原理相同。以下是一个例子:

library(data.table)
plouf <- setDT(list( v = v, diff = c(NA,diff(v))))
plouf[diff > 0,inc := v]
plouf[diff < 0, dec := v]

f50 <- rep(1/51,51)
plouf[,v_smooth := filter(v, f50, sides = 2)]
plouf[,diff_smooth :=c(NA,diff(v_smooth))]

plouf[diff_smooth > 0,inc_smooth := v_smooth]
plouf[diff_smooth < 0, dec_smooth := v_smooth]

你可以很容易地找到最棒的,或者做任何你想做的事。

我真的不知道我是否理解这个问题。12月0日<代码>有什么问题?请注意,因为您有
NA
值,所以您需要
哪个
。我真的不知道我是否理解这个问题。12月0日<代码>有什么问题?请注意,由于您有
NA
值,您将需要
。从未使用过这些函数,但我猜它们是这样工作的:
shift
v
系列向下推一行,并将其存储为列
vl
。现在,每个
v
观测值与
vl
列中的前一个值配对
Rleid
获取每次更改的me ID,
vl>v
条件的计算结果为真/假。是否有一种聪明的方法来更改
runs
列,以便只使用两个ID来增加/减少序列?可能通过创建两个单独的列,一个用于增加运行,另一个用于减少运行?这也可能有助于解决原始帖子中的第五个要点。您可以使用条件
vl>v
来区分这两个系列。它们应该按顺序递增,因此如果您想分离ID,可以执行类似于
data[vl>v,increasingRuns:=runs/2]
data的操作[vl从未使用过这些函数,但我想它们是这样工作的:
shift
v
系列向下推一行,并将其存储为列
vl
。每个
v
观察值现在都与
vl
列中的前一个值配对。
Rleid
获取每次更改的ID,
vl>v
条件的计算结果为TRUE/FALSE。是否有一种聪明的方法来更改
运行次数
列,以便只使用两个ID来增加/减少序列?可能通过创建两个单独的列,一个用于增加,一个用于减少运行次数?这也可能有助于解决原始POST的第五个要点ld只需使用条件
vl>v
来分隔这两个序列。它们应该按顺序递增,因此如果要分隔ID,可以执行类似
data[vl>v,increasingRuns:=runs/2]
data的操作[VL这看起来很棒!使用
na.contiguity
我现在可以在
inc
inc\u smooth
)和
dec
dec\u smooth
)中查找最长的递增/递减拉伸没有NAs。但是,这忽略了它们的实际值。你能想出一种方法来提取所有拉伸的最大增加/减少量,而不考虑拉伸的长度吗?基本上,对于所有拉伸(数值不被NAs打断),你从第一个值中减去最后一个值,然后你必须找到最大值(对于递增系列)最小值(对于递减系列)对于这个操作。有什么想法吗?@ArneBrandschwede我在我的答案中添加了几行来解决你的问题。变量decvalue是最后一个和第一个递减值的差值,对于递增也是一样。这看起来很棒!使用
na。连续的
我现在可以在
inc
inc_smooth
)和
dec
dec_smooth
)不使用NAs。但是,这忽略了它们的实际值。你能想出一种方法来提取所有拉伸的最大增加/减少量,而不管拉伸的长度有多长吗?基本上,对于所有拉伸(数值不被NAs打断)单独从第一个val中减去最后一个值
library(data.table)
plouf <- setDT(list( v = v, diff = c(NA,diff(v))))
plouf[diff > 0,inc := v]
plouf[diff < 0, dec := v]

f50 <- rep(1/51,51)
plouf[,v_smooth := filter(v, f50, sides = 2)]
plouf[,diff_smooth :=c(NA,diff(v_smooth))]

plouf[diff_smooth > 0,inc_smooth := v_smooth]
plouf[diff_smooth < 0, dec_smooth := v_smooth]
plouf[,grouptmp := abs(c(NA,diff(ifelse(diff>0,1,0))))]
plouf[is.na(grouptmp),grouptmp:= 0]
plouf[,group := cumsum(grouptmp)]

plouf[,decvalue := dec[.N] - dec[1], by = group]
plouf[,incvalue := inc[.N]-inc[1], by = group]

                  v          diff           inc           dec group     decvalue grouptmp
   1:            NA            NA            NA            NA     0           NA        0
   2:            NA            NA            NA            NA     0           NA        0
   3:            NA            NA            NA            NA     0           NA        0
   4:            NA            NA            NA            NA     0           NA        0
   5:            NA            NA            NA            NA     0           NA        0
   6:            NA            NA            NA            NA     0           NA        0
   7:            NA            NA            NA            NA     0           NA        0
   8:            NA            NA            NA            NA     0           NA        0
   9: -0.0344851657            NA            NA            NA     0           NA        0
  10:  0.0788633499  0.1133485156  0.0788633499            NA     0           NA        0
  11: -0.0415118591 -0.1203752090            NA -0.0415118591     1  0.000000000        1
  12:  0.0557818390  0.0972936981  0.0557818390            NA     2           NA        1
  13: -0.0314433977 -0.0872252367            NA -0.0314433977     3  0.000000000        1
  14:  0.0098391432  0.0412825409  0.0098391432            NA     4           NA        1
  15: -0.0147885296 -0.0246276728            NA -0.0147885296     5  0.000000000        1
  16: -0.0009157661  0.0138727635 -0.0009157661            NA     6           NA        1
  17:  0.0303060166  0.0312217827  0.0303060166            NA     6           NA        0
  18: -0.0384165912 -0.0687226078            NA -0.0384165912     7 -0.005185349        1
  19: -0.0436019399 -0.0051853487            NA -0.0436019399     7 -0.005185349        0
  20:  0.0821260908  0.1257280307  0.0821260908            NA     8           NA        1
  21: -0.0172987636 -0.0994248545            NA -0.0172987636     9 -0.003255037        1
  22: -0.0205538005 -0.0032550369            NA -0.0205538005     9 -0.003255037        0
  23: -0.0114417208  0.0091120797 -0.0114417208            NA    10           NA        1
  24:  0.0524503477  0.0638920686  0.0524503477            NA    10           NA        0
  25: -0.0105871856 -0.0630375333            NA -0.0105871856    11 -0.047042624        1
  26: -0.0576298093 -0.0470426237            NA -0.0576298093    11 -0.047042624        0
  27:  0.0031608195  0.0607906288  0.0031608195            NA    12           NA        1
  28: -0.0009828784 -0.0041436979            NA -0.0009828784    13  0.000000000        1
  29:  0.0167153471  0.0176982255  0.0167153471            NA    14           NA        1
  30:  0.0088964230 -0.0078189241            NA  0.0088964230    15 -0.033234568        1
  31:  0.0065035882 -0.0023928348            NA  0.0065035882    15 -0.033234568        0
  32: -0.0243381450 -0.0308417332            NA -0.0243381450    15 -0.033234568        0