【问题标题】:How to replace a column in R? strange behavior with dates如何替换R中的列?日期的奇怪行为
【发布时间】:2010-07-09 08:01:32
【问题描述】:

我正在尝试将不常见的日期格式转换为标准日期。基本上我有一个数据集,其中包含一个半年频率的周期,格式如下: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)) 

它返回的结果最接近我想要的结果: 结构.13665..类..日期.. 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 添加一列(无效)

感谢您提前提出任何建议!

【问题讨论】:

    标签: r dataframe lapply


    【解决方案1】:

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

    您也可以通过替换副附加期间/日期列来使这个更清洁。

    【讨论】:

      【解决方案2】:

      这很奇怪……:

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

      返回“2006-06-01”“2006-01-01”等。我惊呆了,因为 period2date 函数已经包含 as.Date()。这是我的问题的解决方案,但我不完全理解它......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-15
        • 2020-05-02
        • 1970-01-01
        • 2012-02-24
        • 1970-01-01
        • 2012-04-25
        • 2014-03-18
        • 2014-11-23
        相关资源
        最近更新 更多