我正在尝试将不常见的日期格式转换为标准日期。基本上我有一个数据集,其中包含半年度频率的周期,格式如下: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))
返回了最接近我想要的结果: 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添加一列(不起作用)
对于任何提前建议,请等等!答案 0 :(得分: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))
您也可以通过替换附加句点/日期列的副词来使其更清洁。
答案 1 :(得分:0)
这很奇怪......:
as.Date(sapply(mydf$period,period2date))
返回“2006-06-01”“2006-01-01”等。我被震惊了因为period2date函数已经包含as.Date()。这是我的问题的解决方案,但我完全不理解......