2015-02-09 45 views
1

最后序列我有这样的示例数据缺少SEQ()中的R

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

问题是,在to 35200结束,并且忽略最后80我需要在作为最后值涉及。 如何实现它有没有什么简单的方法? 我试过along.withlength.out参数,但我不能走低谷。

+2

什么是你想要的输出?如果你想从200到35280数到200s,那么这个函数正在做它应该做的事 – 2015-02-09 21:05:31

+0

我知道它的确如此,但是我要求如何修改它以将最后一个值作为输出的一部分添加(即使它不是按参数完成的原始顺序)。下面的答案完成这项工作。 – Bury 2015-02-10 06:53:58

回答

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 
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

太好了,谢谢。它完成这项工作。 – Bury 2015-02-10 07:05:17

+0

该解决方案不起作用。检查以下值 > end < - 10 > step < - 2 > to <-seq(from = 1,to = end,by = step) > m = end %%步骤 > if(m! = 0){ + +为= C(至,结束) +} > >尾(至) [1] 1 3 5 7 9 > >步骤< - 3 > >至< -seq(from = 1,to = end,by = step) > m = end %%步骤 > > if(m!= 0){ + +为= C(至,结束) +} >尾(至) [1] 1 4 7 10 10 – 2017-06-21 14:36:29

+0

第一,你写没有我的解决方案 - 我的溶液作品结束= 10和步骤= 2;第二,通过使用你的解决方案,我得到[1] 1 3 5 7 9.我建议你用rm(list = ls())开始你的代码。 – djas 2017-06-21 18:42:04

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

那么,如果我复制你的第二个代码,结果是尾巴(x) [1] 34400 34600 34800 35000 35200 200 – Bury 2015-02-10 06:56:53