2010-07-09 64 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()的數據框。此外,您還可以節省一些時間,如果你使用矢量操作(我覺得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()。這是我的問題的解決方案,但我不完全瞭解它...