Определить строку, которая соответствует двум условиям

#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)