【问题标题】:Converting day of week to number in R将星期几转换为R中的数字
【发布时间】:2016-01-05 15:39:04
【问题描述】:

我无法将包含工作日的 .csv 数据列转换为数字(因此 1 = 星期一、2 = 星期二、3 = 星期三等)。我正在尝试使用 strptime 功能,如下所示:http://www.inside-r.org/r-doc/base/strftime

由于我想将工作日转换为数字,因此我使用了“%u”格式选项。下面是我的代码:

> newweekdaynum <- strptime(SFCrimeData$DayOfWeek, "%u")

SFCrimeData 是我拥有的包含大量犯罪信息的数据集。运行语句后没有出现错误,但是当我想打印“newweekdaynum”时,出现的只是一个巨大的值表,所有值都显示为“NA”。

我做错了什么?

【问题讨论】:

  • 如果你有v1 &lt;- c('Monday', 'Tuesday', ....'Sunday'); factor(v1, levels=c('Monday',,.., 'Sunday'), labels=1:7)或使用?match
  • dput(SFCrimeData$DayOfWeek) 并将输出添加到您的帖子中。
  • @Pascal,SFCrimeData 文件有大约 800k 行,所以我不能在这里完全粘贴完整的输出,但我运行了命令,基本上它是一个从 1 到 10 的数字,带有一个“L”紧随其后。
  • @RaleighL。你试过我建议的factor 方法吗?
  • @erasmortg 所以我跑了一遍,然后又得到了一大组带有数字和 L 的数据,然后在底部我有这个 .Label = c("Friday", "Monday", "Saturday", "Sunday", "Thursday", "Tuesday", "Wednesday"), class = "factor") [1] Wednesday Wednesday Wednesday Wednesday Wednesday @987654330 @Levels: Friday Monday Saturday Sunday Thursday Tuesday Wednesday。如何从每个值中去除 L,使其只是整数本身?

标签: r weekday


【解决方案1】:

strptime 如果您有可以解析为完整日期/日期时间的内容,则可以使用。它将返回一个日期时间对象。这不是你想要的。

相反,您可以使用有序因子:

#some example data
set.seed(42)
x <- factor(sample(c("Monday", "Tuesday", "Wednesday", 
                     "Thursday", "Friday", "Saturday", "Sunday"),
            20, TRUE))
# [1] Sunday    Sunday    Wednesday Saturday  Friday    Thursday  Saturday  Monday    Friday    Friday    Thursday  Saturday  Sunday   
#[14] Tuesday   Thursday  Sunday    Sunday    Monday    Thursday  Thursday 
#Levels: Friday Monday Saturday Sunday Thursday Tuesday Wednesday

#turn into ordered factor
x <- factor(x, levels = c("Monday", "Tuesday", "Wednesday", 
                          "Thursday", "Friday", "Saturday", "Sunday"),
            ordered = TRUE)
#[1] Sunday    Sunday    Wednesday Saturday  Friday    Thursday  Saturday  Monday    Friday    Friday    Thursday  Saturday  Sunday   
#[14] Tuesday   Thursday  Sunday    Sunday    Monday    Thursday  Thursday 
#Levels: Monday < Tuesday < Wednesday < Thursday < Friday < Saturday < Sunday

#extract underlying integer values
as.integer(x)
#[1] 7 7 3 6 5 4 6 1 5 5 4 6 7 2 4 7 7 1 4 4

(您实际上不需要将其设为有序因子,具有以正确顺序指定的水平的因子就足够了,但工作日在概念上是一个有序因子。)

【讨论】:

    【解决方案2】:
    df$Date <- as.Date(df$Date)  
    df$wkdaynum <- format(df$Date,"%u")  
    df$wkdaynum <- as.numeric(df$wkdaynum)
    

    所以,你的错误是使用 strptime() 而不是 format()。

    【讨论】:

    • 谢谢,我用过,确实更好看:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2014-01-11
    相关资源
    最近更新 更多