我正在尝试在数据框中对一系列日期进行子集化。我想对数据的不同部分进行分组。
例如使用内置数据集
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")
答案 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
类。
现在我加载了lubridate
包。
# Load packages
library(lubridate)
date
列的格式为year-month-day
,因此我们可以使用ymd
函数。
# Convert the date column to Date class
dt$date <- ymd(dt$date)
如果您的数据集具有不同的日期格式,则可以使用其他功能,例如dmy
或mdy
。
date
列现在位于Date
级。我们可以输入class(dt$date)
进行确认。
最后,有两个选项可以按date
列对数据进行子集化。
您可以设置开始日期和结束日期以对数据进行子集化。请记住将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"))
我们还可以使用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" )