#r
#r
Вопрос:
Мне нужно определить, какая строка соответствует двум следующим условиям: — Строка до текущего месячного количества осадков меньше 20 — Строка после текущего месячного количества осадков выше 20
Я пытаюсь определить, когда начинается сезон посадки, для этого я хотел сказать (например): сезон посадки начнется в том месяце, когда за месяц до осадков было меньше 20, но месяц после выше. В этом примере я отправил вам, что месяцем будет октябрь, потому что в сентябре количество осадков равно 2, а в ноябре равно 100. Мне нужно написать функцию, которая выдает мне индекс, соответствующий этому месяцу.
df <- data.frame(month=c(1:12),monthly_rainfall=c(60,67,164,65,5,3,0,1,2,24,100,102))
Спасибо
Ответ №1:
Вы можете использовать функции lead()
и lag()
вместе с filter()
library(dplyr)
df %>%
filter(lag(monthly_rainfall) < 20,
lead(monthly_rainfall) > 20)
month monthly_rainfall
1 9 2
2 10 24
Вы можете получить индекс с помощью
df %>% mutate(planting_season = lag(monthly_rainfall) < 20 amp; lead(monthly_rainfall) > 20) %$%
planting_season %>%
which()
[1] 9 10
Или вы могли бы получить месяц с:
df %>% filter(lag(monthly_rainfall) < 20,
lead(monthly_rainfall) > 20) %$%
month
[1] 9 10
Комментарии:
1. Приятно слышать. Если это решило вашу проблему, пожалуйста, примите ответ, чтобы другие могли его найти.
Ответ №2:
Базовое решение R:
get_months <- function(x, high = 20, low = 20) {
n <- length(x)
which(c(NA, x[1:(n-1)]) < high amp; c(x[2:n], NA) > low)
}
Тогда вы можете назвать это следующим образом:
get_months(df$monthly_rainfall)
# 9 10
Комментарии:
1. вы также можете параметризовать ее с помощью аргументов
y
иz
, чтобы, если OP захочет изменить нижнюю и верхнюю границы предыдущего и следующего месяцев, т. Е.which(c(NA, x[1:(n-1)]) < y amp; c(x[2:n], NA) > z)