агрегирующие элементы для создания групп минимального размера - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть следующий примерный вектор:

v = c(3, 23, 224, 124, 49)

, представляющий количество элементов в соответствующем списке.

Я хотел бы создать группы по крайней мере из 50 элементов на основе следующегоКритерии:

  1. , если группа уже превышает 50, я предпочитаю не трогать ее.

  2. Я могу группировать только смежные элементы.

Итак, в этом случае я начинаю с суммирования 3 и 23, а мне все еще не 50. Поэтому я добавляю 26 к 224 (хотя я предпочел не делать этого на основе правила1).Так что после первой итерации у меня c(250, 124, 49).Но у меня все еще есть 49. Таким образом, я группирую 49 к 124, снова против первого правила - у меня нет другого выбора, и окончательный результат:

v_f = c(250, 173)

Как мне сделать это автоматически иэффективно в R?

Ответы [ 2 ]

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

Я не мог придумать симпатичную R-функцию .. так вот цикл for

v = c(3, 23, 224, 124, 49)

#initilise
result <- c()
loopcounter = 0; sum = 0; cumsum_threshold = 50

#loop through v
for (i in v) {
  #calculate the cumulative sum
  sum = i + sum
  #if cumsum > 50
  if (sum >= cumsum_threshold ) {
    #pass to result-vector
    result[ length( result ) + 1 ] <- sum
    #reset cumsum to 0
    sum <- 0
  }
  #increase loopcounter
  loopcounter = loopcounter + 1
  #when at the end of v, AND sum < threshold
  if ( loopcounter == length( v ) & sum < cumsum_threshold ) {
    #add sum to last entry of result-vector
    result[ length( result ) ] <- result[ length( result) ] + sum
  }
}

result
#[1] 250 173
0 голосов
/ 13 декабря 2018

Это может работать:

Мы инициируем накопительную сумму j, начиная с 0, групповое значение k, начиная с 1 и групповой вектор w, установленный наNA с длиной = length(v).

j <- 0
k <- 1
w <- rep(NA, length(v))

Теперь мы зациклимся на i = 1:length(v), установив значение группировки k в векторе группы w в позиции i, добавим текущее значениеот v[i] до j и сложите k, когда j равно >= 50, сброс j на 0.Если последняя группа не заполняет до 50, сбросьте все значения последней группы в векторе группировки w на значение k-1:

for(i in 1:length(v)){
  w[i] <- k
  j <- j + v[i]
  if(i == length(v) & j < 50){
    w[w == k] <- k-1
  }
  if(j >= 50){
    k <- k + 1
    j <- 0
  }
}

Пример:

v = c(3, 23, 224, 124, 49, 17, 3, 8, 12)
> w
[1] 1 1 1 2 3 3 3 3 3

df <- cbind.data.frame(v, w)
    v w
1   3 1
2  23 1
3 224 1
4 124 2
5  49 3
6  17 3
7   3 3
8   8 3
9  12 3

Теперь мы можем aggregate над группой, чтобы получить кумулятивные суммы:

aggregate(v ~ w, df, sum)
  w   v
1 1 250
2 2 124
3 3  89
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...