首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取序列中的最后一个数字,然后将其降低到R中的阈值以下

获取序列中的最后一个数字,然后将其降低到R中的阈值以下
EN

Stack Overflow用户
提问于 2020-12-11 18:26:30
回答 1查看 29关注 0票数 0

我有以下数据:

代码语言:javascript
复制
dat<- structure(list(Pentad = 1:73, RR = c(0, 0.014285714, 0, 0.088571429, 
0.071428571, 0, 0.065714286, 0.028571429, 0.094285714, 0.011428571, 
0, 0, 0, 0, 0, 0, 0.04, 0, 0.814285714, 0.285714286, 1.14, 5.334285714, 
2.351428571, 1.985714286, 1.494285714, 2.005714286, 20.04857143, 
25.00857143, 16.32, 11.06857143, 8.965714286, 3.985714286, 5.202857143, 
7.802857143, 4.451428571, 9.22, 32.04857143, 19.50571429, 3.148571429, 
2.434285714, 9.057142857, 28.70857143, 34.15142857, 33.02571429, 
46.50571429, 70.61714286, 3.168571429, 1.928571429, 7.031428571, 
0.902857143, 5.377142857, 11.35714286, 15.04571429, 11.66285714, 
21.24, 11.43714286, 11.69428571, 2.977142857, 4.337142857, 0.871428571, 
1.391428571, 0.871428571, 1.145714286, 2.317142857, 0.182857143, 
0.282857143, 0.348571429, 0, 0.345714286, 0.142857143, 0.18, 
4.894285714, 0.037142857), YY = c(0.577142857, 0, 1.282857143, 
1.445714286, 0.111428571, 0.36, 0, 0, 0, 1, 0.011428571, 0.008571429, 
0.305714286, 0, 0, 0, 0, 0.8, 0.062857143, 0, 0, 0, 0, 0.013333333, 
0.043333333, 1.486666667, 0, 2.486666667, 1.943333333, 0.773333333, 
8.106666667, 7.733333333, 0.5, 4.356666667, 2.66, 6.626666667, 
4.404285714, 7.977142857, 12.94285714, 18.49428571, 7.357142857, 
11.08285714, 9.034285714, 14.29142857, 34.61428571, 45.30285714, 
6.66, 6.702857143, 5.962857143, 14.85428571, 2.1, 2.837142857, 
7.391428571, 32.03714286, 9.005714286, 3.525714286, 12.32, 2.32, 
7.994285714, 6.565714286, 4.771428571, 2.354285714, 0.005714286, 
2.508571429, 0.817142857, 2.885714286, 0.897142857, 0, 0, 0, 
0, 0.145714286, 0.434285714)), class = "data.frame", row.names = c(NA, 
-73L))

有三列: Pentad、RR和YY。

我想要得到以下几点:

(a)当降水量超过“至少连续三候”中的“年平均值”时,获得第一候

(b)当降水量超过至少连续三候的“年平均值”时,获取最后一候,然后将其降至年平均值以下。

我能够使用以下脚本执行(a)操作:

代码语言:javascript
复制
first_exceed_seq <- function(x, thresh = mean(x), len = 3)
{
  # Logical vector, does x exceed the threshold
  exceed_thresh <- x > thresh

  # Indices of transition points; where exceed_thresh[i - 1] != exceed_thresh[i]
  transition <- which(diff(c(0, exceed_thresh)) != 0)

  # Reference index, grouping observations after each transition
  index <- vector("numeric", length(x))
  index[transition] <- 1
  index <- cumsum(index)

  # Break x into groups following the transitions
  exceed_list <- split(exceed_thresh, index)

  # Get the number of values exceeded in each index period
  num_exceed <- vapply(exceed_list, sum, numeric(1))

  # Get the starting index of the first sequence where more then len exceed thresh
  transition[as.numeric(names(which(num_exceed >= len))[1])]
  }

  first_exceed_seq(dat$RR)

这是时间序列的图表:

(a)项的正确答案是27。

我想问(b)项我可以怎样做呢?(b)的正确答案应该是57。

我将非常感谢在R这方面的任何帮助。

EN

回答 1

Stack Overflow用户

发布于 2020-12-14 12:38:12

我不知道我是否把你的问题弄对了。

这是我尝试过的:

代码语言:javascript
复制
dat %>% 
  mutate(
    anual_mean = mean(RR),
    exceed_thresh = RR > anual_mean,
    lag1 = lag(exceed_thresh, 1),
    lag2 = lag(exceed_thresh, 2),
    pick_3 = ifelse(exceed_thresh & lag1 & lag2, RR, NA)
  )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65249567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档