我正在使用R,我需要设置一个循环(我认为),我从日期中提取月份并指定一个季节.我想将冬季分配到12, 1, 2;春季到3, 4, 5;夏季到6, 7, 8;秋季,9, 10, 11.我有一部分数据如下.我对循环很糟糕,无法弄明白.同样对于约会,我不确定像lubridate这样的软件包是如何工作的
"","UT_TDS_ID_2011.Monitoring.Location.ID","UT_TDS_ID_2011.Activity.Start.Date","UT_TDS_ID_2011.Value","UT_TDS_ID_2011.Season"
"1",4930585,"7/28/2010 0:00",196,""
"2",4933115,"4/21/2011 0:00",402,""
"3",4933115,"7/23/2010 0:00",506,""
"4",4933115,"6/14/2011 0:00",204,""
"8",4933115,"12/3/2010 0:00",556,""
"9",4933157,"11/18/2010 0:00",318,""
"10",4933157,"11/6/2010 0:00",328,""
"11",4933157,"7/23/2010 0:00",290,""
"12",4933157,"6/14/2011 0:00",250,""
Run Code Online (Sandbox Code Playgroud)
关于问题的主题/标题,实际上可以在不提取月份的情况下这样做.下面的前两个解决方案不提取月份.还有第三个解决方案确实提取月份但只是增加它.
1)as.yearqtr/as.yearmon将日期转换为年/月并添加一个月(1/12).然后日历季度对应于季节,因此转换为年/季度yq,并标记季度,如图所示:
library(zoo)
yq <- as.yearqtr(as.yearmon(DF$dates, "%m/%d/%Y") + 1/12)
DF$Season <- factor(format(yq, "%q"), levels = 1:4,
labels = c("winter", "spring", "summer", "fall"))
Run Code Online (Sandbox Code Playgroud)
赠送:
dates Season
1 7/28/2010 summer
2 4/21/2011 spring
3 7/23/2010 summer
4 6/14/2011 summer
5 12/3/2010 winter
6 11/18/2010 fall
7 11/6/2010 fall
8 7/23/2010 summer
9 6/14/2011 summer
Run Code Online (Sandbox Code Playgroud)
1a)这种变化是使用chron quarters,它产生一个因子,因此levels=1:4不必指定.要使用chron,请将(1)中的最后一行替换为:
library(chron)
DF$Season <- factor(quarters(as.chron(yq)),
labels = c("winter", "spring", "summer", "fall"))
Run Code Online (Sandbox Code Playgroud)
chron也可以与其余解决方案一起使用.
2)切.此解决方案仅使用R的基数.首先将日期转换为月份的第一个使用,cut并添加32以获取下个月的日期,d.对应的季度d是季节,因此计算季度使用quarters和构造标签的方式与第一个答案相同:
d <- as.Date(cut(as.Date(DF$dates, "%m/%d/%Y"), "month")) + 32
DF$Season <- factor(quarters(d), levels = c("Q1", "Q2", "Q3", "Q4"),
labels = c("winter", "spring", "summer", "fall"))
Run Code Online (Sandbox Code Playgroud)
给出相同的答案.
3)POSIXlt此解决方案也只使用R的基数:
p <- as.POSIXlt(as.Date(DF$dates, "%m/%d/%Y"))
p$day <- 1
p$mo <- p$mo+1
DF$Season <- factor(quarters(p), levels = c("Q1", "Q2", "Q3", "Q4"),
labels = c("winter", "spring", "summer", "fall"))
Run Code Online (Sandbox Code Playgroud)
注1:levels=如果我们知道每个季节出现,我们可以选择省略所有这些解决方案.
注2:我们使用了这个数据框:
DF <- data.frame(dates = c('7/28/2010', '4/21/2011', '7/23/2010',
'6/14/2011', '12/3/2010', '11/18/2010', '11/6/2010', '7/23/2010',
'6/14/2011'))
Run Code Online (Sandbox Code Playgroud)