【问题标题】:R: sum vector's value under condition and resize vectorR:求和向量在条件下的值和调整向量的大小
【发布时间】:2015-10-27 23:03:34
【问题描述】:

我有一个向量 Pn

Pn<-c(10,6,7,5,8,1,2,2,3)

我需要对值求和,直到结果为&gt;= 5,然后删除我求和的值。在这种情况下,我需要将向量变为:

Pn= 10,6,7,5,8,1+2+2=5,3 

最后一个值 (3) 是可以的,因为不可能生成其他值。我正在尝试使用 for 循环和 while 循环,但我遇到了问题,因为长度(Pn)减小了它的尺寸

for (i in 1:(length(Pn)-1)) {
  if (Pn[i]<5) {
    j=i
    while (Pn[j]<5 | j==length(Pn)) {
      Pn[j]<-Pn[j]+Pn[j+1]
      Pn=Pn[-(j+1)]
    }
  }
}

有没有一个函数可以在没有循环的情况下解决我的问题?

【问题讨论】:

  • 有多种方法可以使输入向量的总和为 5。你是选第一个来的,还是随便选一个?
  • 我不想要一个 5 的通用总和。我希望所有单个值都必须小于 5。所以我扫描每个单个值,如果它小于 5,那么我与下一个值相加直到小于 5。然后必须删除总和值
  • 在您的输入向量中,如果您从第一个条目开始,sum(10) &gt;= 5 那么它不应该在那里结束吗?是什么决定了它的 1+2+2 被求和,而不是任何其他方式你可以对该向量的条目求和以获得高于 5 的值?
  • 这个想法是我从第一个索引扫描向量到最后一个索引。当我的值 = 5(在本例中为索引号 7 和 8)。所以我想删除总和的值(在索引号 7 和 8 处)并继续扫描其他索引
  • 我认为您可以使用循环,但需要使用 c() 而不仅仅是替换。所以像c(Pn[1:(i-1)], Pn[j] + Pn[j+1], Pn[(j+2):length(Pn)].

标签: r vector resize sum


【解决方案1】:

虽然大多数 R 人讨厌循环,但这里有一个循环解决方案:

Pn<-c(10,6,7,5,8,1,2,2,3)

newPn <- vector()
while (length(Pn)>0)
{
  a <- 0
  while (a<5)
  {
    a <- a+Pn[1]
    Pn <- Pn[-1]
    if (length(Pn)==0) {break}
  }
  newPn <- c(newPn,a)
}

结果:

> newPn
[1] 10  6  7  5  8  5  3

一个更长的例子: 输入:

 [1]  8  6  5  5  9  3  4  5 10  7  4  6  5  2  3  2  2  5  6  3  7  4 10  2  9  8  8  9 10  6

输出:

 [1]  8  6  5  5  9  7  5 10  7 10  5  5  9  6 10 14 11  8  8  9 10  6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多