我有一个大型环境数据集,我想添加一个列,然后根据另一列中的日期范围为新列A,B,C,... L中的行分配一个字母。到目前为止,我的代码是
prec <- read.csv("precipitation.csv") #read file
prec_DI <- subset(prec, Location=="Dauphin Island") #subset one location
这会创建一个类似的输出:
prec_DI$Date <- as.Date(strptime(prec_DI$Date, format="%Y%m%d")) #convert date column to R format
df.DI<-data.frame(sumPrec=tapply(prec_DI$Prec, factor(prec_DI$Date), sum)) #sum all values for each date
df.DI$Date<-row.names(df.DI) #add a row names column
DI10 <- subset(df.DI, Date>="2010-05-17"& Date<="2010-10-31") #subset data based on a date range
我不在乎行名与Date列相同,我可以很容易地改变它。 我尝试使用
添加一个新的空列DI10$Period <- DI10
相反,我想创建一个新列,其中分配了日期范围2010-05-17 - 2010-06-03&#34; A&#34;,范围2010-03-04 - 2010-03-16是分配&#34; B&#34;等等。我非常感谢你提供任何帮助,我确信这是一个直截了当的问题,但我刚开始学习。
根据要求,我正在添加此输出
structure(list(sumPrec = structure(c(0.4, 1.6, 1.9, 1.3, 1.4, 1.7), .Dim = 6L,
.Dimnames = list(c("2010-05-18", "2010-05-26", "2010-05-29", "2010-05-30",
"2010-05-31", "2010-06-01"))), Date = c("2010-05-18", "2010-05-26",
"2010-05-29", "2010-05-30", "2010-05-31", "2010-06-01" )),
.Names = c("sumPrec", "Date"), row.names = c("2010-05-18", "2010-05-26",
"2010-05-29", "2010-05-30", "2010-05-31", "2010-06-01" ), class = "data.frame")
答案 0 :(得分:1)
有几种方法可以做到这一点。首先,将日期列转换为POSIXct类对象,表示日历日期:
DI10$Date <- as.POSIXct(as.Date(DI10$Date))
然后,您可以使用cut.POSIXt()
功能
DI10$Period <- cut.POSIXt(
DI10$Date,
breaks = as.POSIXct(as.Date(c("1970-01-01", "2010-05-17", "2010-05-29", "9999-12-31"))),
labels = c("C", "A", "B"))
使用提供的中断(其中第一个和最后一个日期代表外部边界)来缩短您的日期范围;或者你可以创建一个包含开始/结束日期和标签的数据框,例如
dates <- data.frame(Start = c("2010-05-17", "2010-03-04"),
End = c("2010-05-28", "2010-03-16"),
Label = c("A", "C"),
stringsAsFactors = FALSE)
dates$Start <- as.POSIXct(as.Date(dates$Start))
dates$End <- as.POSIXct(as.Date(dates$End))
然后使用sapply
遍历您的日期以执行Period
作业
DI10$Period <- sapply(DI10$Date, function(x) {
out <- dates$Label[x >= dates$Start & x <= dates$End]
if (length(out) == 0) "B" else out
})
输出:
DI10
# sumPrec Date Period
# 2010-05-18 0.4 2010-05-18 08:00:00 A
# 2010-05-26 1.6 2010-05-26 08:00:00 A
# 2010-05-29 1.9 2010-05-29 08:00:00 B
# 2010-05-30 1.3 2010-05-30 08:00:00 B
# 2010-05-31 1.4 2010-05-31 08:00:00 B
# 2010-06-01 1.7 2010-06-01 08:00:00 B