#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. Пожалуйста, добавьте дополнительные подробности, чтобы расширить свой ответ, например, ссылки на рабочий код или документацию.