Как заменить столбец в R?странное поведение с датами
Вопрос
Я пытаюсь преобразовать необычный формат даты в стандартную дату.По сути, у меня есть набор данных, содержащий период с полугодовой частотой, отформатированный следующим образом:206 обозначает вторую половину 2006 года, 106 обозначает первую половину и так далее.Чтобы переставить его на 01.06.2006 или 01.01.2006, я написал небольшую функцию:
period2date = function(period)
{
check=list()
check=strsplit(as.character(period),split="")
x=as.numeric(check[[1]][1])
p=ifelse( x >= 2,6,1)
x=2
out=paste(x,"0",check[[1]][2],check[[1]][3],"-",p,"-1",sep="")
out=as.Date(out)
return(out)
}
теперь вы можете смеяться :) .В любом случае, эта функция работает, и здесь возникает проблема.Я хочу применить эту функцию к столбцу времени data.frame.Я попробовал следующее:
as.data.frame(lapply(mydf$period,period2date))
который вернул результат, наиболее близкий к тому, что я хочу:структура.13665..класс....Дата..1 01.06.2006
и так далее..очевидно, мне бы хотелось сохранить название моего столбца — или, что еще лучше, просто добавить дату в новом формате к исходному файлу df.Плюс я попробовал:
sapply(mydf$period,period2date) # with results equal to the line below
unlist(lapply(mydf$period,period2date))
[1] 13300 13514 13665
Все, что я хочу сделать, это изменить необычный 206 и т. д.отформатируйте до 2006-06-01 (который работает) и добавьте столбец в mydf (который не работает)
заранее спасибо за любые предложения!
Решение
R
хранит даты в виде чисел, поэтому я думаю, что у вас какое-то странное поведение, потому что вы работаете с выводом даты (т. е. помещаете даты обратно в матрицу, что заставляет их выглядеть как числа, которыми они являются на самом деле).Вместо этого вам следует явно использовать data.frame с data.frame()
.Кроме того, вы можете сэкономить некоторое время, если будете использовать векторизованные операции (я думаю, что apply
семья все еще использует циклы):
period2date <- function(period) {
period <- as.character(period)
half <- substr(period, 1, 1)
year <- substr(period, 2, 3)
dates <- as.Date(ifelse(half=="1", paste(year, "0101", sep=""), paste(year, "0701", sep="")), format="%y%m%d")
return(dates)
}
data <- data.frame(data, period2date(data$dates))
Вы можете сделать это более чистым, заменив пороки, добавив также столбец периода/даты.
Другие советы
Это странно ...:
as.Date(sapply(mydf$period,period2date))
.
Возвращает "2006-06-01" "2006-06-01" "2006-01-01" и т. Д. Я ошеломлен, потому что функция Progist2Date уже содержит AS.date ().Это решение моей проблемы, но я полностью не понимаю ...