R中0 1向量中每个0位置的总和

时间:2019-02-12 08:27:19

标签: r

我正在尝试计算0和1的向量中每个0之后的所有1的总和。

例如,

0 0 1 0 1 将会: 2(第1个0之后的全1)+ 2(第2个零之后的全1)+1(第4个位置的第3个零之后的1)= 5

因此,如果不对6中的每一个向量求和,则只对向量(3 * 2)中的整个向量求和就不会是6。

这是我尝试过的方法,但是不起作用:

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和1的向量。我做了一个从0开始的计数器,然后尝试计算从每个i位置到最终位置(第10个位置)的总和,但仅当i等于0时。

实际上,它只是计算向量中每个0的所有1的总和。

谢谢您的帮助!

2 个答案:

答案 0 :(得分:6)

给出

<div class="questionholder" id="question5">
  <div>
    <h5>Select all that apply</h5>
    <input class="input5" type="checkbox" id="ID1elementColor" name="ID1element" value="color"><label for="ID1elementColor"><p class="radioChoice">Color</p></label>
    <input class="input5" type="checkbox" id="ID1elementHeight" name="ID1element" value="height"><label for="ID1elementHeight"><p class="radioChoice">Height</p></label>
    <input class="input5" type="checkbox" id="ID1elementWeight" name="ID1element" value="weight"><label for="ID1elementWeight"><p class="radioChoice">Weight</p></label>
  </div>
</div>
<div class="holdButtons">
  <a class="text2button">Next</a>
</div>

这是一种矢量化方式

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的想法是,我们以后只想将!x为零,即不是1(或不是x)的元素相加。

结果

TRUE

这需要加起来以获得所需的输出。

答案 1 :(得分:1)

尝试一下:

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]