【问题标题】:Missing last sequence in seq() in RR中的seq()中缺少最后一个序列
【发布时间】:2015-02-09 21:02:04
【问题描述】:

我有这个示例数据

by<-200
to<-seq(from=by,to=35280,by=by)

问题是to 以 35200 结束,并忽略我需要作为最后一个值参与的最后 80 个。 有没有什么直接的方法来实现它? 我试过along.withlength.out 参数,但我无法通过。

【问题讨论】:

  • 你想要的输出是什么?如果您想以 200 秒从 200 数到 35280,那么该函数正在做它应该做的事情
  • 我知道确实如此,但我询问如何修改它以添加最后一个值作为输出的一部分(即使它不是由参数 by 完成的原始序列)。下面的答案就可以了。

标签: r seq


【解决方案1】:

您可以将向量的最后一个元素的 if 语句放置在以下函数中:

seqlast <- function (from, to, by) 
{
  vec <- do.call(what = seq, args = list(from, to, by))
  if ( tail(vec, 1) != to ) {
    return(c(vec, to))
  } else {
    return(vec)
  }
}

然后

by <- 200
to <- seqlast(from=by,to=35280,by=by)

会回来

> head(to)
[1]  200  400  600  800 1000 1200
> tail(to)
[1] 34400 34600 34800 35000 35200 35280

【讨论】:

    【解决方案2】:

    seq()中,“第二种形式产生 from,from+by,...,直到小于等于to的序列值。”而且由于35280不在请求的序列,不返回。

    但是您可以在想要包含下一个值的参数中使用计算。既然您知道 to 的值,请为其命名并使用它。

    by <- 200
    out <- 35280
    
    x <- seq(from = by, to = (out + by - out %% by), by = by)
    
    length(x)
    # [1] 177
    x[length(x)]
    # [1] 35400
    

    如果要包含to 值,即使它不在请求的序列中,也可以编写一个小函数将其添加回来

    seqil <- function(..., include.last = TRUE) {
        x <- do.call(seq.default, list(...))
        if(include.last) c(x, to) else x
    }
    
    by <- 200
    
    x <- seqil(from = by, to = 35280, by = by)
    tail(x)
    # [1] 34400 34600 34800 35000 35200 35280
    

    【讨论】:

    • 好吧,如果我复制你的第二个代码,结果是 tail(x) [1] 34400 34600 34800 35000 35200 200
    【解决方案3】:

    首先,seq() 的行为与您的示例一样。您想要seq() 本身根本无法交付的东西。

    一个解决方案(当然有很多)是在序列的末尾检查天气“还有任何东西”,如果有,请添加另一个元素。 (或者修改序列的最后一个元素,不清楚你想要实现的目标。)像这样:

    step <- 200
    end <- 35280
    to<-seq(from=step,to=end,by=step)
    
    # the modulus of your end point by step
    m = end%%step 
    
    # if not zero, you have something to add to your sequence
    if(m != 0) {
    
        # add the end point
        to = c(to, end)
    }
    
    tail(to,2)
    # 35200 35280
    

    【讨论】:

    • 解决方案不起作用。检查以下值 > end step to m = end%%step > if(m != 0) { + + to = c(to, end) + } > > tail(to) [1] 1 3 5 7 9 > > step > to m = end%%step > > if(m != 0) { + + to = c(to, end) + } > tail(to) [1] 1 4 7 10 10
    • 首先,你写的不是我的解决方案——我的解决方案适用于 end = 10 和 step = 2;其次,通过使用您的解决方案,我得到 [1] 1 3 5 7 9。我建议您使用 rm(list=ls()) 开始您的代码。
    • 没有。您的解决方案不起作用。让“end
    【解决方案4】:

    虽然没有解决引发的确切问题,但我首选的解决方案是扩展序列以添加一个附加值,以便将 to 值包含在序列中,而不仅仅是在末尾附加 to 值。 这建立在@djas 和@Etienne Kintzler 的答案之上。

    seq0 <- function(from = 1, to = 1, by = 1, incLast = TRUE){
        out = do.call(what = seq, args = list(from, to, by))
        if (incLast & to%%by != 0){
            out = c(out, tail(out, 1) + by) 
        } 
        return(out)
    }
    

    示例输出:

    > seq0(from = 0, to = 20, by = 6, incLast = FALSE)
    [1]  0  6 12 18
    > seq0(from = 0, to = 20, by = 6, incLast = TRUE)
    [1]  0  6 12 18 24
    > seq0(from = 0, to = -20, by = -6, incLast = FALSE)
    [1]   0  -6 -12 -18
    > seq0(from = 0, to = -20, by = -6, incLast = TRUE)
    [1]   0  -6 -12 -18 -24
    

    【讨论】:

      【解决方案5】:

      这是对 Rich Scriven 答案的修改,在不需要时不会添加额外的数字(如 20

      by <- 2
      out <- 21
      out <- 20
      
      x <- seq(from = 0, to = out + by*ifelse(out %% by>0,1,0) - out %% by , by = by)
      x
      

      【讨论】:

        【解决方案6】:

        您可以使用 c() 来包含最后一个数字。

        by<-200
        c(seq(from=by,to=35280,by=by), 35280)
        

        【讨论】:

        • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
        猜你喜欢
        • 1970-01-01
        • 2014-06-29
        • 2017-08-11
        • 2020-07-09
        • 2016-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        相关资源
        最近更新 更多