Mydata = c(1, 5, 0, 10, 40, 30, 25, 20, 7, 34, 23, 55, 70, 42, 38, 22, 44, 33, 11, 17, 25)
results = list()
# loop each element of the data vector to check if it can be the start of a result
for (x in 1:length(Mydata)) {
if (Mydata[x] >= 40) {
# start subresult list
subresult = c(Mydata[x])
i = 0
# add elements while decreasing
while (Mydata[x+i+1] < Mydata[x+i]) {
subresult = append(subresult, Mydata[x+i+1])
i = i + 1
}
# store in main result list if last element of subresult <= 20
if (subresult[length(subresult)] <= 20){
results[[length(results)+1]] = subresult
}
}
}
5条答案
按热度按时间wgeznvg71#
非惯用的过程方法:
结果:
vs3odd8k2#
使用“标准”方式创建基于值之间差异的分组变量(
cumsum(...diff(...))
;Create grouping variable for consecutive sequences and split vector)。使用tapply
按组检查条件。删除空列表元素。或者一次性过滤
tapply
的结果:使用
data.table
的逻辑相同:xuo3flqw3#
hsvhsicv4#
使用
dplyr
sconsecutive_id
得到分组,使用group_split
分离分组,使用周围的sapply
提取分组作为向量inn6fuwd5#
试试这个序列:
step2[length(step2)]
(又名tail(step2,1)
)是否是<= 20
将由您决定;如果是,你很好,如果不是,那么就没有一条通往那里的道路(我认为)。演练:
1.第一步,从40开始:
1.第2步,我们可以沿着向量使用
cummin
(累积最小值)来找到运行最小值:然后用这个来寻找累积出现的次数,这就是真实的值。
我们需要使用
cumsum(.) < 1
步骤,因为如果以下值之一实际匹配,我们可能会得到一个无意的匹配,如这显然不在原始数据中。