2016-09-22 35 views
0

我有一个较大的环境数据集,我想在其中添加一列,然后为新列A,B中的行分配一个字母,C,... L基于另一列中的日期范围。到目前为止我的代码是如何在数据框中添加一列代表另一列中的日期范围

prec <- read.csv("precipitation.csv") #read file 
prec_DI <- subset(prec, Location=="Dauphin Island") #subset one location 

这将创建像这样的输出:

enter image description here

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 

现在输出看起来是这样的: enter image description here

我不在乎行名与日期列相同,我可以很容易地改变它。 我尝试用

DI10$Period <- DI10 

添加一个新的空列,但这个创造: enter image description here

相反,我想创建一个新的列,其中的日期范围2010-05-17 - 2010-06- 03被分配“A”,范围2010-03-04 - 2010-03-16被分配“B”,依此类推。我非常感谢这方面的任何帮助,我确信这是一个直截了当的问题,但我刚开始学习。

按照要求我加入这个输出

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

这将是他人有所帮助,如果您有您的数据,例如在你的问题中复制并粘贴'dput(head(DI10))'的输出。 –

+0

谢谢你的建议,我把它添加到这个问题。 – user3281487

+0

它在哪里?我没有看到'dput()' – Sotos

回答

1

有几个方法可以做到这一点。首先,将您的日期列到POSIXct类对象,代表一个日历日期:

​​

然后,您可以使用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 
+0

第一个选项效果非常好!非常感谢! – user3281487

相关问题