Объединить векторные элементы ниже заданного порогового значения - PullRequest
1 голос
/ 03 октября 2019

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

Это решение работает, но не векторизовано и выглядит грязным. Есть ли более элегантный векторизованный подход к решению этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...