在R中的seq()中缺少最后一个序列

问题描述 投票:3回答:4

我有这个示例数据

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

问题是to以35200结束并且忽略了我需要作为最后一个值参与的最后80个。有没有任何直截了当的方法如何实现它?我尝试过along.withlength.out参数,但我不能低谷。

r seq
4个回答
2
投票

您可以将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()中,“第二种形式从......生成,从......生成,直到小于或等于的序列值。”而且由于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

0
投票

首先,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

0
投票

虽然没有解决确切的问题,但我的首选解决方案是扩展序列以添加一个额外的值,以便将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
© www.soinside.com 2019 - 2024. All rights reserved.