2015-02-09 44 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