【问题标题】:Subsetting a dataframe for a specified month and year为指定的月份和年份设置数据框的子集
【发布时间】:2019-09-12 12:17:40
【问题描述】:

我有一个数据框,其中第一列是 d/m/y 格式的日期,第二列是数值(销售额)。

我想为一年中的每个月创建子集(例如 11/11、12/11 等)。我尝试了这个答案中建议的代码:subset a data.frame with multiple conditions

当月的条件被施加时它会起作用:

subset(sales, format.Date(date, "%m")=="11")

但是当我添加年份条件时,它返回一个带有错误消息invalid 'x' argument 的空子集:

subset(sales, format.Date(date, "%m")=="11" & format.Date(date, "%y")=="11")

我在 Ubuntu 10.04 上使用 R 2.10.1-2,感谢您提供的帮助。

【问题讨论】:

    标签: r date subset


    【解决方案1】:

    由于您没有提供数据集,因此我根据您提供的链接制作了自己的数据集。你的方法对我有用,只有当我不满足提供的两个条件(月份和年份)时,我才会得到一个空数据集,所以我猜你是在尝试对日期序列(月份和年份)进行子集化) 不存在(但如果没有您使用的代码就无法确定)。这是我使用的代码:

    sales <- read.table(text="2372  Kansas KS2000111 HUMBOLDT, CITY OF    ATRAZINE    1.3 05/07/2006
    9104  Kansas KS2000111 HUMBOLDT, CITY OF    ATRAZINE   0.34 07/23/2006
    9212  Kansas KS2000111 HUMBOLDT, CITY OF    ATRAZINE   0.33 02/11/2007
    2094  Kansas KS2000111 HUMBOLDT, CITY OF    ATRAZINE    1.4 05/06/2007
    16763 Kansas KS2000111 HUMBOLDT, CITY OF    ATRAZINE   0.61 05/11/2009
    1076  Kansas KS2000111 HUMBOLDT, CITY OF METOLACHLOR   0.48 05/12/2002
    1077  Kansas KS2000111 HUMBOLDT, CITY OF METOLACHLOR    0.3 05/07/2006")
    
    sales$V9 <- as.Date(sales$V9, "%m/%d/%Y")
    names(sales)[9] <- 'date'
    subset(sales, format.Date(date, "%m")=="05" & format.Date(date, "%y")=="07")
    #    V1     V2        V3        V4   V5 V6       V7  V8       date
    #4 2094 Kansas KS2000111 HUMBOLDT, CITY OF ATRAZINE 1.4 2007-05-06
    
    subset(sales, format.Date(date, "%m")=="05" & format.Date(date, "%y")=="10")
    #[1] V1   V2   V3   V4   V5   V6   V7   V8   date
    #<0 rows> (or 0-length row.names)
    

    【讨论】:

    • 经过几次尝试,我的代码在 2011 年 11 月使用:subset(sales, format.Date(date, "%m")=="11" & format.Date(date, "% d")=="11")。我认为问题出在我用来创建数据框的 read.csv 命令上,但这是一个不同的问题。我可以认为我最初的问题得到了令人满意的回答。
    【解决方案2】:

    此答案避免使用subset,处理缺失的观察结果并使用as.POSIXct 日期/时间格式。虽然,其余代码实际上与 Tyler Rinker 的答案相同。请注意,我必须在 as.POSIXct 中指定日期/时间变量的名称,而不是使用未格式化变量的名称 Date_Time。

    my.data <- read.csv(text = '
              Date_Time,      state,  city
        10/05/2011 07:32:40,    AK,     aa
        15/06/2011 13:26:02,    AK,     bb
        19/07/2011 13:26:02,    OH,     cc
                         NA,    OH,     dd
        20/05/2012 14:57:27,    PA,     ee
        22/07/2012 14:57:27,    AL,     ff
        20/03/2013 15:03:18,    NY,     gg
    ', header=TRUE, stringsAsFactors = FALSE, na.strings = 'NA', strip.white = TRUE)
    
    my.data$my_Date_Time <- as.POSIXct(my.data$Date_Time, format = "%d/%m/%Y %H:%M:%S")
    
    # Select May
    my.data[format.Date(my.data$my_Date_Time, "%m")=="05" &
            !is.na(my.data$my_Date_Time),]
    
    #             Date_Time state city        my_Date_Time
    # 1 10/05/2011 07:32:40    AK   aa 2011-05-10 07:32:40
    # 5 20/05/2012 14:57:27    PA   ee 2012-05-20 14:57:27
    
    
    # Select 2012
    my.data[format.Date(my.data$my_Date_Time, "%Y")=="2012" &
            !is.na(my.data$my_Date_Time),]
    
    #             Date_Time state city        my_Date_Time
    # 5 20/05/2012 14:57:27    PA   ee 2012-05-20 14:57:27
    # 6 22/07/2012 14:57:27    AL   ff 2012-07-22 14:57:27
    
    # Select May 2012
    my.data[format.Date(my.data$my_Date_Time, "%m")=="05"   &
            format.Date(my.data$my_Date_Time, "%Y")=="2012" &
            !is.na(my.data$my_Date_Time),]
    
    #             Date_Time state city        my_Date_Time
    # 5 20/05/2012 14:57:27    PA   ee 2012-05-20 14:57:27
    

    【讨论】:

      【解决方案3】:

      日期中的“Y”区分大小写。我不知道为什么,但是“m”代表月份和“d”代表天是小写的,但是“Y”必须是大写的。这应该适合你:

      subset(sales, format.Date(date, "%m")=="11" & format.Date(date, "%Y")=="11")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2020-12-29
        • 1970-01-01
        • 2020-11-21
        • 2022-07-06
        • 1970-01-01
        相关资源
        最近更新 更多