Думаю, я правильно рассчитал среднее расстояние между тремя последовательными значениями при выполнении условия (описанного в коде). Однако я сделал этот расчет только для одного года и не знаю, как сделать это для каждого года. Не могли бы вы мне помочь? Я думаю, мне нужен еще один цикл for, но когда я попробовал это, у меня ничего не получилось.
set.seed(123)
years <- rep(2010:2014, each=365)
months <- rep(rep(1:12, each=31), 5)[1:(5*365)]
days <- rep(1:31, times=5*12)[1:(5*365)]
# Create a data frame with year, month, day,
x <- rnorm(5*365, mean=15, sd=5)
df <- data.frame(Year=years, Month=months, Day=days, Values=x)
library(magrittr)
df_filt <- df %>% dplyr::filter(Year == 2010)
df_filt$Distance <- NA
for (i in 3:nrow(df_filt)) {
if (df_filt$Values[i] > df_filt$Values[i - 1] &&
df_filt$Values[i - 1] > df_filt$Values[i - 2]) {
df_filt$Distance[i] <-
(1/3)*(sqrt((df_filt$Values[i] - df_filt$Values[i - 2])^2) +
sqrt((df_filt$Values[i] - df_filt$Values[i - 1])^2) +
sqrt((df_filt$Values[i - 2] - df_filt$Values[i - 1])^2))
} else {
df_filt$Distance[i] <- NA
}
}
df_filt$Distance2 <- NA
for (i in 3:nrow(df_filt)) {
if (df_filt$Values[i] > df_filt$Values[i - 1] &&
df_filt$Values[i - 1] < df_filt$Values[i - 2]) {
df_filt$Distance[i] <-
(1/3)*(sqrt((df_filt$Values[i] - df_filt$Values[i - 2])^2) +
sqrt((df_filt$Values[i] - df_filt$Values[i - 1])^2) +
sqrt((df_filt$Values[i - 2] - df_filt$Values[i - 1])^2))
} else {
df_filt$Distance[i] <- NA
}
}
sum <- colSums(df_filt[5:6], na.rm=TRUE)
print(sum)
final_sum <- sum(sum)
print(final_sum)
Я отредактировал код, хочу сделать то же самое еще раз для другого условия, а затем хочу найти сумму этих различий для каждого условия. Я хочу, чтобы это происходило каждый год. Должно быть, это более быстрый способ сделать это, но я новичок в R!
Да, согласно комментарию, петли можно устранить. Используйте функцию задержки, чтобы удалить первую группу циклов, а затем используйте функцию суммирования для обработки годовых итогов.
В зависимости от того, как вы хотите провести первые пару дней года, вам может потребоваться изменить расположение расчетов расстояний.
library(dplyr)
df_filt <- df
Distance1 <- ifelse( (df_filt$Values > lag(df_filt$Values, 1, 0)) & (lag(df_filt$Values, 1, 0) > lag(df_filt$Values, 2, 0)),
(1/3)*(sqrt((df_filt$Values - lag(df_filt$Values, 2))^2) +
sqrt((df_filt$Values - lag(df_filt$Values, 1))^2) +
sqrt((lag(df_filt$Values, 2) - lag(df_filt$Values, 1))^2)), NA)
Distance2 <- ifelse( (df_filt$Values > lag(df_filt$Values, 1)) & (lag(df_filt$Values, 1) < lag(df_filt$Values, 2)) ,
(1/3)*(sqrt((df_filt$Values - lag(df_filt$Values, 2))^2) +
sqrt((df_filt$Values - lag(df_filt$Values, 1))^2) +
sqrt((lag(df_filt$Values, 2) - lag(df_filt$Values, 1))^2)) , NA)
df_filt %>% mutate(Distance1, Distance2) %>%
group_by(Year) %>%
summarize(sumDistance1 = sum(Distance1, na.rm=TRUE), sumDistance2 = sum(Distance2, na.rm=TRUE))
Добро пожаловать в СО. Я подозреваю, что для этого вам не нужны никакие циклы, но трудно/невозможно быть уверенным, не видя ожидаемого результата на основе ваших тестовых входных данных.