如何在向量的两个连续元素之间产生差异,如果差异小于 10,则删除以两个零结尾的一个

Posted

技术标签:

【中文标题】如何在向量的两个连续元素之间产生差异,如果差异小于 10,则删除以两个零结尾的一个【英文标题】:How to make the difference between two consecutive elements of a vector and remove the one ending with two zeros if the difference is less than 10 【发布时间】:2021-12-31 14:58:42 【问题描述】:

我正在尝试生成一个向量break_x,它是另一个向量break_init 的结果。如果 break_init 的两个连续元素之间的差小于 10,则以两个零结尾的元素将被删除。 我的代码总是删除breaks_init[i],即使它没有以两个零结尾。 谁能帮忙

break_init <- c(100,195,200,238,300,326,400,481,500,537,600,607,697,700,800,875,900,908,957)
breaks_x <- vector()
for(i in 1:(length(break_init) - 1))

  if (break_init[i+1] - break_init[i] >= 10) 
    breaks_x[i] <- break_init[i]
   else 
    if (grepl("[00]$", as.character(break_init[i])) == TRUE)
      breaks_x[i] <- NA
     else if (grepl("[00]$", as.character(break_init[i])) == FALSE) 
      breaks_x[i+1] <- NA
   else 
      breaks_x[i] <- break_init[i]
  
 

[1]   0 100  NA 200 238 300 326 400 481 500 537  NA 607  NA 700 800 875  NA 908 957 #result breaks_x
[1]   0 100 195  NA 238 300 326 400 481 500 537  NA 607 697  NA 800 875  NA 908 957 #what I want my result to be

【问题讨论】:

[00]$ 没有做你想做的事,它正在寻找字符串末尾的零或零(不是两个零);此外,当浮点“出现”在您的日子里时,它会中断。我认为你可以一步完成,没有循环,就像这个未经测试的代码:x[c(F, diff(x) &lt; 10) &amp; x %% 100 &lt; 1] &lt;- NA。没有正则表达式,没有循环。 谢谢@r2evans !! 【参考方案1】:

r2evans 的想法是正确的。只需稍作修改即可检查前后差异:

bln10 <- diff(break_init) < 10
breaks_x <- replace(break_init, (c(FALSE, bln10) | c(bln10, FALSE)) & break_init %% 100 == 0, NA)
breaks_x
# [1] 100 195  NA 238 300 326 400 481 500 537  NA 607 697  NA 800 875  NA 908 957

【讨论】:

Mayssa,如果这解决了您的问题,请accept it。 @jblood94,感谢您执行我建议的代码;我当时无法测试它,幸好有人能够完成它。

以上是关于如何在向量的两个连续元素之间产生差异,如果差异小于 10,则删除以两个零结尾的一个的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 R 中两个数据集的显着差异?

如果差异小于 10 分钟,如何计算日期之间的时间

如何计算word2vec中的差异向量

对于 C++ Random Access Iterator(向量迭代器),迭代器之间的差异是如何计算的?

有效地计算两个向量之间的差异

第一个元素之间的差异小于或等于第二个元素的最小值的对的数量[关闭]