Дата манипулирования с условными утверждениями - PullRequest
2 голосов
/ 25 апреля 2019

Я пытаюсь сложить и вычесть дни из моего времени, но сталкиваюсь с некоторыми проблемами.

Воспроизводимый пример

df = data.frame(date1=c("2017-07-07", "2017-02-11", "2017-05-22")) 

library(lubridate)
df$date1 <- ymd(df$date1) + years(2)
df$day <- wday(df$date1, label=TRUE)

df$date1 <- as.Date(df$date1, "%Y-%m-%d")
df$day <- as.character(df$day)

Данные

       date1 day 
1 2019-07-07 Sun   
2 2019-02-11 Mon       
3 2019-05-22 Wed  

Задача

Я пытаюсь заставить мой код работать так, чтобы, когда день «воскресенье», он просто копировал ту же дату. Однако мой код выше возвращает «18084» вместо «2019-07-07».

Может ли кто-нибудь объяснить мне, где моя проблема?

library(dplyr)
df %>% mutate(newdate = ifelse(day == "Sun", as.Date(as.character(date1), "%Y-%m-%d"), 1))

       date1 day newdate
1 2019-07-07 Sun   18084
2 2019-02-11 Mon       1
3 2019-05-22 Wed       1

1 Ответ

2 голосов
/ 25 апреля 2019

Проблема в том, что вы пытаетесь вернуть объекты двух разных классов в ifelse.Если вы проверите

str(df)
#'data.frame':  3 obs. of  2 variables:
# $ date1: Date, format: "2019-07-07" "2019-02-11" "2019-05-22"
# $ day  : chr  "Sun" "Mon" "Wed"

Итак, date1 относится к классу "Дата", а остальная часть в вашем ifelse содержит 1, которое является числовым.Так что теперь, чтобы привести их обоих к одному и тому же классу, R делает

as.numeric(as.Date("2019-07-07"))
#[1] 18084

Даты в любом случае представляются внутри как числа.Например,

as.Date(18084, origin = "1970-01-01") #would give
#[1] "2019-07-07"

Возможно, вам понадобится

library(dplyr)
df %>% mutate(newdate = ifelse(day == "Sun", as.character(date1), "1"))

#       date1 day    newdate
#1 2019-07-07 Sun 2019-07-07
#2 2019-02-11 Mon          1
#3 2019-05-22 Wed          1

, но это изменит newdate на класс символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...