R 从向量中提取递增序列和递减序列
我有一个包含2718个观测值的数据框,其中一列是感兴趣的。这是使用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
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