Как конвертировать дату всего за год до даты в формате «Год-месяц-день» в R

Извините за вопрос, я начал использовать RStudio месяц назад, и я сталкиваюсь с вещами, которые я никогда не узнавал. Я проверил все веб-сайты, помогаю и форумы в течение последних двух дней, и это меня сходит с ума.

Я получил переменную под названием Release дающую дату выпуска песни. Некоторые даты соответствуют формату %Y-%m-%d тогда как некоторые другие дают мне только год. Я бы хотел, чтобы они были одинаковыми, но я изо всех сил пытаюсь изменить наблюдения только с годами.

Краткое резюме в слове:

11/11/2011
01/06/2011
1974
1970
16/09/2003

Я импортировал данные с помощью:

music<-read.csv("music2.csv", header=TRUE, sep = ",", encoding = "UTF-8",stringsAsFactors = F)

И это как у меня в RStudio

"2011-11-11" "2011-06-01" "1974" "1970" "2003-09-16" 

Это пример, когда я получил 2200 об.

Рабочий код

Modifdates<- ifelse(nchar(music$Release)==4,paste0("01-01-",music$Release),music$Release)
Modifdates

Я получаю это:

"2011-11-11" "2011-06-01" "01-01-1974" "01-01-1970" "2003-09-16" 

Я просто хотел бы, чтобы они были в одном формате «% Y-% m-% d». Как я могу это сделать?

Поэтому я попробовал это

as.Date(music$Release,format="%Y-%m-%d")

Но я получил NA, где я изменил свои даты.

Может ли кто-нибудь помочь?

Всего 2 ответа


Обновить

Использование sub find вхождения даты, состоящей из одного года ( "(^[0-9]{4}$)" часть), используя обратную ссылку, замените его на добавление -01-01 в конце строки ( "\1-01-01" ) и, наконец, преобразовать его в класс date , используя as.Date() ( as.Date() умолчанию format = "%Y-%m-%d" так что вам не нужно указать его):

dat <- c("2011-11-11", "2011-06-01", "1974", "1970", "2003-09-16") 
dat класс является character :
as.Date(sub("(^[0-9]{4}$)", "\1-01-01", dat))

# "2011-11-11" "2011-06-01" "1974-01-01" "1970-01-01" "2003-09-16"
dat class является factor , но sub автоматически принуждает его к классу character для вас:
# dat <- as.factor(dat); dat

# 2011-11-11 2011-06-01 1974       1970       2003-09-16
# Levels: 1970 1974 2003-09-16 2011-06-01 2011-11-11

as.Date(sub("(^[0-9]{4}$)", "\1-01-01", dat))

# "2011-11-11" "2011-06-01" "1974-01-01" "1970-01-01" "2003-09-16"

Добро пожаловать в SO, попробуйте представить воспроизводимый пример в следующий раз, чтобы мы могли вам помочь. Я думаю, здесь вы можете использовать:

testdates <- c("1974", "12-12-2012")
betterdates <- ifelse(nchar(testdates)==4,paste0("01-01-",testdates),testdates)
> betterdates
[1] "01-01-1974" "12-12-2012"

EDIT: если ваш вектор является фактором, вы должны сначала использовать as.character.factor . Если вы хотите конвертировать обратно в коэффициент, вы можете использовать as.factor

EDIT2: не конвертируйте as.date перед этим. Делайте это только после этой модификации


Есть идеи?

10000