合并低于给定阈值的矢量元素

时间:2019-10-03 18:55:50

标签: r

我有价值观的载体。我想删除低于特定阈值的值,并将它们与之前的值和之后的值一起添加。因此,如果元素n低于阈值,则将元素n-1nn+1相加,然后从向量中删除后两个元素。以下是一个示例。

这是我的虚拟数据。

# Dummy data
foo <- c(4561L, 57L, 1773L, 17623L, 6030L, 5L, 3353L, 3L, 270L, 4L, 
         267L, 15L, 2L, 12L, 348L, 101L, 367L, 3780L, 491L, 18L, 111L, 
         13L, 200L, 8L, 8449L, 34L, 54L, 4L, 6L, 12L, 5L, 14740L, 12208L, 
         1L, 4L, 1599L, 2108L, 13073L, 51L, 2L, 19L, 4L, 109L, 10L, 1087L, 
         4L, 10201L, 19L, 196L, 27L, 1856L, 9L, 6364L, 3L, 7L, 3L, 297L, 
         14731L, 1L, 15L, 323L, 107L, 14547L, 1419L, 6L, 28L, 4L, 10L, 
         20L, 20L, 4868L, 9896L, 6827L, 4306L, 3025L)

# Look at vector
foo
#>  [1]  4561    57  1773 17623  6030     5  3353     3   270     4   267
#> [12]    15     2    12   348   101   367  3780   491    18   111    13
#> [23]   200     8  8449    34    54     4     6    12     5 14740 12208
#> [34]     1     4  1599  2108 13073    51     2    19     4   109    10
#> [45]  1087     4 10201    19   196    27  1856     9  6364     3     7
#> [56]     3   297 14731     1    15   323   107 14547  1419     6    28
#> [67]     4    10    20    20  4868  9896  6827  4306  3025

接下来,我设置阈值和循环计数器i

# Set threshold value & iterator
threshold <- 300
i <- 1

最后,我遍历foo。如果元素小于threshold,则将其添加到元素之前和之后,然后将其与紧随其后的值一起从foo中删除。

# Loop through vector
while(i < length(foo)){
  if(foo[i] < threshold & i > 1){
    foo[i - 1] <- foo[i -1] + foo[i] + foo[i + 1]
    foo <- foo[-c(i, i+1)]
  }else{
    i <- i + 1    
  }
}

所需结果如下:

# Look at result
foo
#>  [1]  6391 17623 10777  3780  9405 14740 12213  1599  2108 13268 20073
#> [12] 14747 14977  1507  4868  9896  6827  4306  3025

该解决方案有效,但没有向量化,似乎很笨拙。有没有更优雅的矢量化方法来解决此问题?

0 个答案:

没有答案