2010-07-09 2 views
2

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

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

, который вернул результат ближе к тому, что я хочу: structure.13665..class .... Дата .. 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 (который не работает)

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

ответ

2

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

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

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

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

Смежные вопросы