Сумма из каждой позиции 0 в векторе 0 1 в R - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь вычислить сумму всех 1 с после каждого 0 в векторе 0 и 1.

Например,

0 0 1 0 1 будет: 2 (все 1 спосле 1-го 0) + 2 (все 1 с после 2-го нуля) + 1 (один 1 после 3-го нуля на 4-й позиции) = 5

Так что не 6, что было бы, если бы вы просто суммировали весь вектор длякаждый 0 в векторе (3 * 2).

Это то, что я пробовал, но не работает:

a <- rbinom(10, 1, 0.5)
counter <- 0
for (i in a){
  if(i == 0)
  counter <- counter + sum(a[i:10])
}
print(counter)

Сначала я создаю вектор из 10 случайных нулей и единиц.Я делаю счетчик, который начинается с 0, затем я пытаюсь вычислить сумму от каждой позиции i до конечной позиции (10-й), но только когда я равняюсь 0.

На самом деле это просто вычисление суммывсех 1 для каждого 0 в векторе.

Спасибо за любую помощь в этом!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Учитывая

x <- c(0, 0, 1, 0, 1)

Вот векторизованный способ

sum(rev(cumsum(rev(x))) * !x)
#[1] 5

Или используя этот вход

set.seed(1)
a <- rbinom(10, 1, 0.5)
a
# [1] 0 0 1 1 0 1 1 1 1 0

Результат равен

sum(rev(cumsum(rev(a))) * !a)
# [1] 16

шаг за шагом

Когда мы вычисляем обратную совокупную сумму rev(x), мы получаем

rev(cumsum(rev(x)))
# [1] 2 2 2 1 1

Результат показывает нас для каждого элемента вx сколько 1 s существует до конца вектора.

Идея умножить этот вектор на !x состоит в том, что позже мы хотим суммировать только те элементы, для которых x равно нулю, то есть не 1 (или не TRUE).

Результат

rev(cumsum(rev(x))) * !x
# [1] 2 2 0 1 0

Это необходимо суммировать для получения желаемого результата.

0 голосов
/ 12 февраля 2019

Попробуйте:

a <- rbinom(10, 1, 0.5)
counter <- 0
for (i in seq_along(a)){
  if(a[i] == 0)
  counter <- counter + sum(a[i:10])
}
print(counter)

В вашем примере i не является итератором.Это значение a вектора.Так что a[i:10] дает либо a[0:10], либо a[1:10].

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