如何将一系列日期分组

时间:2017-06-10 02:36:40

标签: r subset

我正在尝试在数据框中对一系列日期进行子集化。我想对数据的不同部分进行分组。

例如使用内置数据集

data("JohnsonJohnson")

我如何在1965-1975之间对子集进行子集化?然后1975-1985?例如。

注意:我最终想要使用它的数据集被格式化为数据帧而不是时间序列,如果这会产生影响。

修改

以下是我数据框的剪辑:

structure(list(date = c("2016-03-07", "2016-03-07", "2016-03-07", 
"2016-03-07", "2016-03-07", "2016-03-07", "2016-03-07", "2016-03-07", 
"2016-03-07", "2016-03-07"), hour = c("00", "01", "02", "03", 
"04", "05", "06", "07", "08", "09"), temp1mK = c(276.50325, 276.8655, 
277.5455, 277.25875, 277.6625, 277.28475, 277.0955, 277.6815, 
278.2325, 279.9765), index = structure(c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("N-S", "N-S", "E-W", "E-W", "OS"
), class = "factor")), .Names = c("date", "hour", "temp1mK", 
"index"), row.names = c(NA, 10L), class = "data.frame")

2 个答案:

答案 0 :(得分:3)

要使用显示基于年份的日期的列对数据框进行子集化,如果您可以将日期列转换为Date中的R类,那将会很棒,因为它更易于使用。以下示例显示如何使用lubridate包中的函数处理Date类。

首先,您的示例数据集仅包含基于2016列的date年份的记录。我决定将date列替换为从2001开始到2010的5月1日序列。

数据准备

# Example data frame
dt <- structure(list(date = c("2016-03-07", "2016-03-07", "2016-03-07", 
                              "2016-03-07", "2016-03-07", "2016-03-07", "2016-03-07", "2016-03-07", 
                              "2016-03-07", "2016-03-07"), hour = c("00", "01", "02", "03", 
                                                                    "04", "05", "06", "07", "08", "09"), temp1mK = c(276.50325, 276.8655, 
                                                                                                                     277.5455, 277.25875, 277.6625, 277.28475, 277.0955, 277.6815, 
                                                                                                                     278.2325, 279.9765), index = structure(c(1L, 1L, 1L, 1L, 1L, 
                                                                                                                                                              1L, 1L, 1L, 1L, 1L), .Label = c("N-S", "N-S", "E-W", "E-W", "OS"
                                                                                                                                                              ), class = "factor")), .Names = c("date", "hour", "temp1mK", 
                                                                                                                                                                                                "index"), row.names = c(NA, 10L), class = "data.frame")


# Update the date column
dt$date <- paste(2001:2010, "05", "01", sep = "-")

示例数据集现在看起来像这样。

         date hour  temp1mK index
1  2001-05-01   00 276.5032   N-S
2  2002-05-01   01 276.8655   N-S
3  2003-05-01   02 277.5455   N-S
4  2004-05-01   03 277.2588   N-S
5  2005-05-01   04 277.6625   N-S
6  2006-05-01   05 277.2847   N-S
7  2007-05-01   06 277.0955   N-S
8  2008-05-01   07 277.6815   N-S
9  2009-05-01   08 278.2325   N-S
10 2010-05-01   09 279.9765   N-S

请注意,date列位于character类中。我打算将此列转换为Date类。

转换为Date类

现在我加载了lubridate包。

# Load packages
library(lubridate)

date列的格式为year-month-day,因此我们可以使用ymd函数。

# Convert the date column to Date class
dt$date <- ymd(dt$date)

如果您的数据集具有不同的日期格式,则可以使用其他功能,例如dmymdy

date列现在位于Date级。我们可以输入class(dt$date)进行确认。

最后,有两个选项可以按date列对数据进行子集化。

选项1:按特定日期设置子集

您可以设置开始日期和结束日期以对数据进行子集化。请记住将beginging和结束日期转换为Date类。

dt_2001_2005 <- subset(dt, date >= ymd("2001-01-01") & date <= ymd("2005-12-31"))
dt_2006_2010 <- subset(dt, date >= ymd("2006-01-01") & date <= ymd("2010-12-31"))

选项2:按年份设置子集

我们还可以使用year包中的lubridate函数将Date类转换为数字年份数。

dt_2001_2005 <- subset(dt, year(date) >= 2001 & year(date) <= 2005)
dt_2006_2010 <- subset(dt, year(date) >= 2006 & year(date) <= 2010)

答案 1 :(得分:1)

tempdata <- structure(list(date = c("1990-03-07", "1985-03-07", "2012-03-07", 
                        "2012-03-07", "1990-03-07", "1985-03-07", "1990-03-07", "2013-03-07", 
                        "2016-03-07", "2013-03-07"), hour = c("00", "01", "02", "03", 
                                                              "04", "05", "06", "07", "08", "09"), temp1mK = c(276.50325, 276.8655, 
                                                                                                               277.5455, 277.25875, 277.6625, 277.28475, 277.0955, 277.6815, 
                                                                                                               278.2325, 279.9765), index = structure(c(1L, 1L, 1L, 1L, 1L, 
                                                                                                                                                        1L, 1L, 1L, 1L, 1L), .Label = c("N-S", "N-S", "E-W", "E-W", "OS"
                                                                                                                                                        ), class = "factor")), .Names = c("date", "hour", "temp1mK", 
                                                                                                                                                                                          "index"), row.names = c(NA, 10L), class = "data.frame")
year_subset_1980_2000 <- subset(tempdata, date <= "2000" & date > "1980" )
year_subset_2000_2015 <- subset(tempdata, date <= "2015" & date > "2000" )