2015-02-09 4 views
1

У меня есть этот пример данныхОтсутствует последнюю последовательность в последовательности() в R

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

Проблема заключается в том, что to заканчивается на 35200 и игнорировать последние 80, которые мне нужно включать в качестве последнего значения. Есть ли какой-либо путь, как его достичь? Я пробовал параметры along.with и length.out, но я не могу пройти.

+2

Что вывод, что вы хотите? Если вы хотите рассчитывать от 200 до 35280 на 200 секунд, то функция выполняет то, что она должна делать –

+0

Я знаю, что это так, но я прошу, как изменить его, чтобы добавить последнее значение в качестве части вывода (даже если это не в исходной последовательности, выполняемой параметром by). Ответы ниже выполняет эту работу. – Bury

ответ

2

Вы можете, если заявление для последний элемент вектора, например, в следующей функции:

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

+0

Решение не работает. Проверьте со следующими значениями > конец <- 10 > шаг <- 2 > до <-seq (от = 1, to = конец, by = шаг) > m = конец %% шаг > if (m! = 0) { + + для = с (к, конец) +} > > хвост (с) [1] 1 3 5 7 9 > > шаг <- 3 > > до < -seq (from = 1, to = end, by = step) > m = end %% step > > if (m!= 0) { + + в = с (к, конец) +} > хвост (к) [1] 1 4 7 10 10 –

+0

первое, что вы написали там не мое решение - мое решение работ для конца = 10 и шаг = 2; во-вторых, используя ваше решение, я получаю [1] 1 3 5 7 9. Я предлагаю вам запустить свой код с помощью rm (list = ls()). – djas

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

 Смежные вопросы

  • Нет связанных вопросов^_^