2016-10-27 4 views
1

У меня есть вопрос, который может быть очень простым R, но я искал и не мог найти ответ. Я попробовал несколько разных поисковых терминов и, тем не менее, ничего. Прошу прощения, если это было задано раньше. В любом случае ...R: Создание круговой петли, которая сравнивает последнее значение с первым

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

Гипотетический [тривиальный] пример: у меня 10 гостей, сидящих вокруг круглого стола. Я хочу найти разницу между возрастом, идущим по часовой стрелке вокруг круга.

Ages<-c(27,83,65,91,23,10,47,9,71,101) 
for(i in 1:length(Ages)){ 
Difference[i]<-Ages[i]-Ages[i+1] 
} 

Теперь, конечно, это наталкивается на трудности в конце, потому что с человека 10, я + 1 является 11 и, следовательно, из границ. Но я желаю иметь возраст человека 10 по сравнению с возрастом человека 1. А затем остановитесь (то есть не продолжайте круглый и круглый год).

Альтернативно, если это можно сделать более легко с использованием любой из прикладных функций, то это тоже может работать, однако цикл может быть проще.

Благодарим за помощь!

ответ

1

Общее обращение - обивка. Мы можем заполнить раздел, который будет переработан в конце, а затем продолжить как обычно.

Для примера, нам необходимо переработать первый элемент, поэтому мы делаем

Ages1 <- c(Ages, Ages[1]) 
-diff(Ages1) 

я также заменил цикл с векторизованной операцией.

Если мы хотим взять Ages[i] - Ages[i + 2], нам нужно переработать первые 2 элемента:

Ages1 <- c(Ages, Ages[1:2]) 
-diff(Ages1, lag = 2) 

Я думал об этом, тоже. Кажется, что потребуется повторить часть вектора/элемента. Я просто задавался вопросом, было ли немного более элегантным способом сделать это, поскольку может стать более сложным с нетривиальными примерами ...

Я не знаю, что вы подразумеваете под «элегантным». Возможно, вы ищете что-то с %%, по модулю.

i <- 1:length(Ages) 
# [1] 1 2 3 4 5 6 7 8 9 10 

j <- (i + 1) %% length(Ages) 
# [1] 2 3 4 5 6 7 8 9 0 1 

j[j == 0] <- length(Ages) ## have to replace 0 with `length(Ages)` 
# [1] 2 3 4 5 6 7 8 9 10 1 

Ages[i] - Ages[j] 

Это может быть не изящно для вашего предоставленного примера, но в зависимости от ваших реальных настроек это может быть справедливое решение.

+0

Спасибо за комментарий! Кажется, что потребуется ручная повторная часть вектора/элемента. Мне просто интересно, было ли немного более элегантным способом сделать это, так как может стать более сложным с нетривиальными примерами ... – FitzKaos

+0

Спасибо за добавление - я думаю, что это может быть более применимо к моей реальной системе. Цените помощь :) – FitzKaos

0

Если запустить этот код:

Ages<-c(27,83,65,91,23,10,47,9,71,101) 
for(i in 1:(length(Ages)-1)){ 
Difference[i]<-Ages[i]-Ages[i+1] 
} 
Difference[10]=Ages[10]-Ages[1] 

Я думаю, вы получите результат, что вам необходимо.

+0

Спасибо! Я просто задавался вопросом, было ли немного более элегантным способом сделать это, поскольку может стать более сложным с нетривиальными примерами ... – FitzKaos

+0

Хорошо, не проблема!Я не знаю «круговой функции», как то, что вы описываете. Однако это можно сделать –

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