Определите строку, которая соответствует двум условиям - PullRequest
0 голосов
/ 24 апреля 2019

Мне нужно определить, какая строка соответствует двум следующим условиям: - ряд перед настоящим ежемесячным количеством осадков ниже 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))

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Решение Base R:

get_months <- function(x, high = 20, low = 20) {
    n <- length(x)
    which(c(NA, x[1:(n-1)]) < high & c(x[2:n], NA) > low)
}

Тогда вы можете назвать его так:

get_months(df$monthly_rainfall)
# 9 10
0 голосов
/ 24 апреля 2019

Вы можете использовать функции 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 & lead(monthly_rainfall) > 20) %$% 
       planting_season %>% 
       which()

[1]  9 10

Или вы можете получить месяц с:

df %>% filter(lag(monthly_rainfall) < 20,
              lead(monthly_rainfall) > 20) %$% 
              month

[1]  9 10
...