我有价值观的载体。我想删除低于特定阈值的值,并将它们与之前的值和之后的值一起添加。因此,如果元素n
低于阈值,则将元素n-1
,n
和n+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
该解决方案有效,但没有向量化,似乎很笨拙。有没有更优雅的矢量化方法来解决此问题?