найти общий способ агрегирования элементов вектора - PullRequest
0 голосов
/ 14 декабря 2018

У меня вектор ровно 5 элементов.Элементы вектора содержат числа, которые больше 100 и меньше 100. Эти элементы представляют количество точек в определенной области в пространстве.

Я хотел бы найти общий способ объединения элементов, которыеменьше, чем 100, со своими соседями.

Правила следующие:

  1. Я могу присоединиться только к соседям (2 является соседом 1, 3 и 1 являютсяСоседи 2, 4 - единственный сосед 5 ...).

  2. Я не могу объединить более 3 элементов.Так, например, если все элементы 1, 2, 3, 4, 4 вектора меньше, чем 100, я могу объединить между собой только 1,2,3 или 2,3,4 (а не с 5, потому что это снова будет большечем 3).

  3. если элементы для агрегирования - 1,2,4, я могу сделать агрегацию 1 и 2 с 3 и 5 с 4.

Я пытаюсь написать общую функцию для этого, но на данный момент я сгенерировал все возможные комбинации и сказал R, что делать в каждом случае (как я делал выше),что долго и утомительно.

например:

v = c(100, 30, 50, 100, 20)

, поэтому в этом случае мой результат будет:

v1 = c(130, 170) 

от агрегирующих элементов (1 + 2, 3 + 4 + 5).

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

Есть какие-нибудь креативные идеи, как аккуратно это написать?

1 Ответ

0 голосов
/ 14 декабря 2018

Не очень элегантно, но я думаю, что это будет работать:

v = c(100, 30, 50, 100, 20)
v2 <- v
which_ <- which(v == 100)
v2[which_]   <- seq(sum(v==100))
v2[which_-1] <- seq(sum(v==100))[which_-1 != 0]
v2[(which_+1)[which_+1 <= length(v2)]] <- seq(sum(v==100))[which_+1 <= length(v)]
aggregate(v,list(v2),sum)$x
# [1] 130 170
...