如何在向量的两个连续元素之间产生差异,如果差异小于 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) < 10) & x %% 100 < 1] <- 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,则删除以两个零结尾的一个的主要内容,如果未能解决你的问题,请参考以下文章