#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