簡體   English   中英

如何將一列添加到數據框中,並用字母代表另一列中的日期范圍

[英]How do I add a column to data frame with a letter representing a date range in another column

我有一個很大的環境數據集,我想在其中添加一列,然后根據另一列中的日期范圍為新列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

現在輸出看起來像這樣: 在此處輸入圖片說明

我不在乎行名稱是否與“日期”列相同,我可以輕松更改它。 我試圖通過使用添加一個新的空列

DI10$Period <- DI10

但這創建了: 在此處輸入圖片說明

相反,我想創建一個新列,其中將日期范圍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")

有兩種方法可以做到這一點。 首先,將日期列轉換為代表日歷日期的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM