2016-09-22 3 views
0

ich eine große Umweltdatenmenge haben, wo ich eine Spalte hinzufügen möchten, und dann einen Brief an die Zeilen in der neuen Spalte A zuweisen, B , C, ... L basierend auf einem Datumsbereich in einer anderen Spalte. Mein Code so weit istWie kann ich eine Spalte Datenrahmen mit einem Buchstaben repräsentiert einen Datumsbereich in einer anderen Spalte hinzufügen

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

Dieses eine Ausgabe wie so erzeugt:

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 

Nun ist die Ausgabe wie folgt aussieht: enter image description here

ich nicht egal Da die Zeilennamen mit denen in der Datumsspalte übereinstimmen, kann ich dies leicht ändern. Ich habe versucht, eine neue leere Spalte hinzuzufügen, indem

DI10$Period <- DI10 

verwenden, aber diese erstellt: enter image description here

Stattdessen habe ich eine neue Spalte erstellen möchten, wo Datumsbereich 2010-05-17 - 2010-06- 03 ist "A" zugeordnet, Bereich 2010-03-04 - 2010-03-16 ist "B" zugewiesen, und so weiter. Ich wäre sehr dankbar für jede Hilfe, ich bin mir sicher, dass es eine einfache Frage ist, aber ich fange gerade an zu lernen.

Da bat ich diese Ausgabe

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

Es wäre für andere hilfreich sein, wenn Sie Ihre Daten umfassen beispiels Kopieren Sie die Ausgabe von 'dput (head (DI10))' in Ihre Frage. –

+0

Vielen Dank für den Vorschlag, ich habe es zu der Frage hinzugefügt. – user3281487

+0

Wo ist es? Ich sehe kein 'dput()' – Sotos

Antwort

1

Es gibt ein paar Möglichkeiten, es zu tun, ich hinzufügen. Zuerst konvertieren Sie Ihre Datumsspalte auf ein POSIXct Klassenobjekt, ein Kalenderdatum darstellt:

DI10$Date <- as.POSIXct(as.Date(DI10$Date)) 

Dann können Sie entweder die cut.POSIXt() Funktion

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")) 

, die den Datumsbereich schneidet mit den mitgelieferten Pausen (wobei das erste und das letzte Datum die äußeren Grenzen darstellen); oder Sie können einen Datenrahmen mit Start-/Enddaten und Beschriftungen erstellen, z.

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)) 

und dann sapply können Sie durch Ihre Daten iterieren die Period Zuordnung tun

DI10$Period <- sapply(DI10$Date, function(x) { 
    out <- dates$Label[x >= dates$Start & x <= dates$End] 
    if (length(out) == 0) "B" else out 
}) 

Ausgang:

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

Die erste Option funktioniert wunderbar! Ich danke dir sehr! – user3281487

Verwandte Themen