У меня есть вектор значений. Я хотел бы удалить значения ниже определенного порога и добавить их вместе с предыдущим значением и значением сразу после этого. Итак, если элемент 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
Это решение работает, но не векторизовано и выглядит грязным. Есть ли более элегантный векторизованный подход к решению этой проблемы?