2016-09-22 32 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

相關問題