Отсутствует последняя последовательность в seq() в R

#r

#r #seq

Вопрос:

У меня есть этот пример данных

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

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

Комментарии:

1. Какой результат вы хотите получить? Если вы хотите посчитать от 200 до 35280 на 200 секунд, то функция выполняет то, что она должна делать

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

Ответ №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
 

Комментарии:

1. Ну, если я скопирую ваш второй код, результатом будет 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
 

Комментарии:

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

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

3. Нет. Ваше решение не работает. Пусть «end <- 10» и «step <- 2». значение «m <- end %% step» равно 0. Таким образом, вы не попадаете внутрь вашего оператора if. Таким образом, значение «to <- seq(from= 1,to=end,by= step)» остается неизменным «[1] 1 3 5 7 9» и не заканчивается на 10, что неправильно.

Ответ №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 amp; 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)
 

Комментарии:

1. Пожалуйста, добавьте дополнительные подробности, чтобы расширить свой ответ, например, ссылки на рабочий код или документацию.