2010-07-09 70 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()。这是我的问题的解决方案,但我不完全了解它...