【问题标题】:Creating a switch-statement创建 switch 语句
【发布时间】:2010-07-26 00:53:33
【问题描述】:

最近,我需要将一系列日期从"July 25, 2010" 格式转换为标准R 格式"2010-07-25"

> head(old.data$dateoccurred)`
[1] "April 9, 2004"     "September 1, 2004" "February 7, 2005

为了解决这个问题,我想做一个 12 种情况的 switch 语句,它返回一个月的数字表示;但是,R 不支持本机开关(至少,我找不到)。

因此,创建开关的最类似于 R 的方式是什么?

【问题讨论】:

    标签: r switch-statement


    【解决方案1】:

    DrewConway 很好地回答了切换问题。基础日期问题具有专门针对它的功能。 strptime() 会将字符串转换为标准时间对象,您可以将其格式化为任何您喜欢的格式。

    strptime("September 1, 2004", "%B %d, %Y")
    
    [1] "2004-09-01"
    

    (当然上面表达式中的字符串常量可以用你的字符串向量代替)

    【讨论】:

    • 谢谢,约翰。我不知道那个功能。
    【解决方案2】:

    这个答案的灵感来自于在 Python 中使用 dictreplicate switch behavior。与其使用本机开关,不如创建一个 list,它由月份名称和数字等价物的值索引:

    months<-list("January"="01","February"="02","March"="03","April"="04","May"="05","June"="06","July"="07","August"="08","September"="09","October"="10","November"="11","December"="12")
    

    有了这个列表,可以直接使用sapply 来创建转换:

    new.dates<-sapply(as.character(old.data$dateoccurred),function(x) paste(strsplit(x," ")[[1]][3],month.convert(strsplit(x," ")[[1]][1]),sub(",","",strsplit(x," ")[[1]][2]),sep="-"))
    

    现在我们已经按照我想要的方式格式化了数据。

    head(new.data$dateoccurred)
    [1] 2004-04-09 2004-09-01 2005-02-07 2005-02-19 2005-02-22 2005-03-11
    264 Levels: 2004-04-09 2004-09-01 2005-02-07 2005-02-19 2005-02-22 2005-03-11 2005-03-15 2005-03-19 2005-05-13 2005-06-28 2005-06-29 2005-07-05 ... 2009-12-22
    

    【讨论】:

    • 不错的把戏,德鲁,但这样做的 R-ish 方式确实在约翰的回答中。将日期字符串解析为 Date() 类型(您可以验证、计算、使用 etc pp 执行 difftime()),然后格式化回您喜欢的任何其他文本表示形式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    相关资源
    最近更新 更多