2012-02-23 96 views
6

我有一个数据帧,其中第一列是在d /米/ 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,感谢您的帮助。

回答

4

既然你没有提供的数据集我做了我自己从你提供的链接。你的方法对我的作品和我得到一个空的数据集,只有当我不符合双方提供的条件(年,月),所以我猜你是你试图子集的日期系列(年,月)不存在(但没有你使用的代码就无法确定)。下面是我使用的代码:

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

经过多次尝试,我的代码工作使用,2011年11月:子集(销售,format.Date(日期,“%m”)==“11”&format.Date(日期,“%d”)==“11”)。我认为问题在于我用来创建数据框的read.csv命令,但这是一个不同的问题。我可以认为我最初的问题是令人满意的。 – 2012-02-23 14:52:54

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 
0

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

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