Как заменить столбец в R?странное поведение с датами - PullRequest
2 голосов
/ 09 июля 2010

Я пытаюсь преобразовать необычный формат даты в стандартную дату.В основном у меня есть набор данных, который содержит период с полугодовой частотой, отформатированный как: 206, обозначающий вторую половину 2006 года, 106, обозначающий первую половину и т. Д.Чтобы переставить его на 2006-06-01 или 2006-01-01, я написал небольшую функцию:

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)) 

, который вернул результат, наиболее близкий к тому, что я хочу: struct.13665..class .... Date .. 1 2006-06-01

ии так далее. Очевидно, я бы хотел сохранить название своей колонки - или, что еще лучше, просто добавить недавно отформатированную дату в мою оригинальную 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 (который не работает)

спасибо за любые предложения заранее!

Ответы [ 2 ]

2 голосов
/ 09 июля 2010

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))

Вы можете сделать это чище, заменив тиски, добавив столбец периода / даты, также.

0 голосов
/ 09 июля 2010

Это странно ...:

as.Date(sapply(mydf$period,period2date))

возвращает "2006-06-01", "2006-01-01" и т. Д. Я ошеломлен, потому что функция period2date уже содержит as.Date (). Это решение моей проблемы, но я не понимаю его полностью ...

...