Изменить значение переменных за определенные месяцы R data.frame?

#r #dataframe #if-statement #tidyverse #lubridate

#r #dataframe #if-оператор #tidyverse #lubridate

Вопрос:

Я хотел бы изменить значения Obs и Sim -1.23 когда Month =< 2 amp; Month >= 11 . Кажется чем-то простым, но я не придумываю никакого решения.

 library(tidyverse)
library(lubridate)

set.seed(123)

DF <- data.frame(Date = seq(as.Date("2001-01-01"), to = as.Date("2003-12-31"), by = "day"),
                  Ob = runif(1095,1,5), Sim = runif(1095,1,5)) %>% 
        separate(Date, into = c("Year", "Month", "Day"))
 

Комментарии:

1. Вы не можете иметь значение месяца <= 2, а также >= 11 одновременно. Я думаю amp; , что (И) должно быть | (ИЛИ).

Ответ №1:

Сначала преобразуйте Month в числовое, чтобы вы могли сравнить значения. Затем вы можете изменить значения Ob Sim столбцов и на постоянные, когда Month <= 2 ИЛИ >= 11 .

 DF$Month <- as.numeric(DF$Month)
DF[DF$Month <= 2 |  DF$Month >= 11, c('Ob', 'Sim')] <- -1.23
 

Или с помощью %in% :

 DF[DF$Month %in% c(1,2,11,12), c('Ob', 'Sim')] <- -1.23
 

Если вы хотите использовать dplyr , вы могли бы сделать :

 library(dplyr)
DF <- DF %>% 
       mutate(across(c(Ob, Sim), ~replace(., Month %in% c(1, 2, 11, 12), -1.23)))
 

Комментарии:

1. Как насчет чего-то вроде использования Month %in% c(1,2,11,12) и изменения значений? Можем ли мы изменить значения для этих месяцев, не выходя из оператора канала (%>%) ?

Ответ №2:

Необходимо решить пару проблем. Один из них — сделать месяц и дату числовыми, чтобы вы могли использовать для них операторы equal и greater / less . Как только у вас это будет, используйте case_when для выполнения вашей логики замены. Третья проблема заключается в том, что =< это недопустимая функция. Вы должны использовать <= . Наконец, Month <= 2 amp; Month >= 11 вернет 0 строк, потому что ни одна строка не может вернуть TRUE для обоих предложений. В моем примере я использовал другой критерий.

 library(tidyverse)
library(lubridate)

set.seed(123)

DF <- tibble(Date = seq(ymd("2001-01-01"), to = ymd("2003-12-31"), by = "day"),
             Ob = runif(1095,1,5),
             Sim = runif(1095,1,5)) %>% 
  mutate(Year = year(Date),
         Month = month(Date),
         Day = mday(Date))

DF %>% 
  mutate(Ob = case_when(Month <= 10 amp; Month >= 6 ~ -1.23,
                        TRUE ~ Ob),
         Sim = case_when(Month <= 10 amp; Month >= 6 ~ -1.23,
                        TRUE ~ Sim)) %>% 
  filter(Month <= 10 amp; Month >= 6)

# A tibble: 6 x 6
  Date          Ob   Sim  Year Month   Day
  <date>     <dbl> <dbl> <dbl> <dbl> <int>
1 2001-06-01 -1.23 -1.23  2001     6     1
2 2001-06-02 -1.23 -1.23  2001     6     2
3 2001-06-03 -1.23 -1.23  2001     6     3
4 2001-06-04 -1.23 -1.23  2001     6     4
5 2001-06-05 -1.23 -1.23  2001     6     5
6 2001-06-06 -1.23 -1.23  2001     6     6