#r
#r
Вопрос:
В одном из моих домашних заданий меня попросили напечатать цены облигаций за 2015,2016,2017,2018 годы. Поскольку в 2015,2016 годах было 252 торговых дня, в 2017 году — 251, а в 2018 году — 250, мне нужно написать оператор if. Вот моя попытка:
plt <- function(a) {
if (a == 2015) {
x <- 1:252
}
else if (a == 2016) {
x <- 1:252
}
else if (a == 2017) {
x <- 1:251
} else {
x <- 1:250
}
plot(x=x, y=data[data$Year == a, 5], type="l", col="red")
}
Однако, когда я ввожу
function(c(2015, 2016, 2017, 2018))
отображается только черновик 2015 года, и R возвращает
Warning messages:
1: In if (a == 2015) { :
the condition has length > 1 and only the first element will be used
2: In data$Year == a :
longer object length is not a multiple of shorter object length
Если я введу эти годы отдельно, это даст четыре идеальных графика.
Комментарии:
1. У вас есть дата, связанная с каждой ценой? Если да, я думаю, что их печать была бы лучше. Если нет, то, что вы, вероятно, хотите визуализировать, это распределение цен (по годам), и в этом случае диаграмма рассеяния менее подходит для этой задачи, чем другие варианты, такие как прямоугольная диаграмма, гистограмма или частотный полигон.
2. Ваш
if
оператор работает нормально, но он выполняется только для первого элемента. Поместите это вfor
цикл,for (i in 1:length(a)) { ...your code with a[i] instead of a...}
.3. Не могли бы вы предоставить некоторую информацию о вызываемом объекте
data
, пожалуйста?4. Это немного сбивает с толку, но здорово, что вы предоставили некоторый код. Сначала мне интересно,
function(c(2015,2016,2017,2018)
вы имеете в видуplt(2015,2016,2017,2018)
, если вместо. Вместоif
вы, вероятно, хотитеifelse
, который будет использовать векторизованный подход.5. Спасибо вам, ребята. Проблема не устранена.
Ответ №1:
Давайте предположим, что вместо function(c(2015,2016,2017,2018)
вы имеете в виду plt(c(2015,2016,2017,2018)
. Если я ошибаюсь в этом, я удалю ответ.
Давайте запустим функцию. В этом случае a == c(2015, 2016, 2017, 2018)
.
В вашей функции, которую вы спрашиваете, делает a == 2015
. Нет, это не так; a
это вектор длиной 4, как показано выше. 2015 в r — это скаляр или вектор длиной 1.
Делает a == 2016
? Нет, и аналогично для 2017 и 2018 годов. Итак, ни одно из ваших условий if никогда не выполняется, и, следовательно, ваше plot()
не может работать, потому что x
никогда не создается.
Вместо этого вы можете захотеть переписать свой код, чтобы брать a
и работать с каждым элементом. Также вы можете захотеть упростить, создав a_length <- c(252, 252, 251, 205)
, а не записывая все.
На этом этапе вы можете использовать цикл for или lapply()
для получения графиков.