2016-10-06 4 views
-2

Ich habe folgenden Datenrahmen mit Datum und Wert Spalten:Aggregation basierend auf Datumsbereich

DF2 <- data.frame("Date"=c("2016-09-01","2016-09-02","2016-09-03","2016-09-05","2016-09-06"), 
       "Value1"=c(20,200,60,150,140), 
       "Value2"=c(15,20,15,30,30), 
       "Value3"=c(80,42,29,40,39)) 

Dann habe ich zwei Datumseingabeparameter:

dateFrom <- "2016-09-02" 
dateTo <- "2016-09-05" 

Wie kann ich jede numerische Spalte aggregieren (Value1 - Value3) basierend auf diesem Datumsbereich? Ich möchte einfache Summe als Aggregationskriterium berechnen. Vielen Dank für Ihren Ratschlag in Vorwärts.

Antwort

0

Die Daten:

DF2 <- data.frame("Date"=as.Date(c("2016-09-01","2016-09-02","2016-09-03","2016-09-05","2016-09-06"),format = "%Y-%m-%d"), 
        "Value1"=c(20,200,60,150,140), 
        "Value2"=c(15,20,15,30,30), 
        "Value3"=c(80,42,29,40,39)) 
dateFrom <- as.Date("2016-09-02",format = "%Y-%m-%d") 
dateTo <- as.Date("2016-09-05",format = "%Y-%m-%d") 

Mit dplyr:

library(dplyr)  
DF2%>%filter(Date<=dateTo&Date>=dateFrom)%>%select(-Date)%>%colSums() 
    Value1 Value2 Value3 
     410  65 111 

Edit: Ich den Typ Datum ändern (in einem Datumsformat) direkt in DF2. Wenn Sie nicht tun, müssen Sie tun:

DF2 %>% transform(Date = as.Date(Date, format = "%Y-%m-%d"))%>%filter(Date<=dateTo&Date>=dateFrom)%>%select(-Date)%>%colSums() 
+0

Vielen Dank Jungs. Deine Antworten sind wirklich großartig !!!! Ich werde Haborymes Herangehensweise anwenden, scheint für meine Zwecke am besten zu sein. – martinkabe

+0

Zusätzliche Frage ... Wie kann ich das Ergebnis in einen Datenrahmen konvertieren? – martinkabe

+0

Wenn Sie die Ergebnisse in Result speichern, können Sie folgendes tun: 'data.frame (t (Result), row.names = NULL)'. – Haboryme

1

Es sollte funktionieren.Die Daten sollten nach Datum bestellen.

DF2 <- data.frame("Date"=as.Date(c("2016-09-01","2016-09-02","2016-09-03","2016-09-05","2016-09-06")), 
       "Value1"=c(20,200,60,150,140), 
       "Value2"=c(15,20,15,30,30), 
       "Value3"=c(80,42,29,40,39)) 
dateFrom <- as.Date("2016-09-02") 
dateTo <- as.Date("2016-09-05") 
start <- which(DF2$Date == dateFrom) 
end <- which(DF2$Date == dateTo) 
lapply(DF2[start:end,2:4],sum) 
0

Ist das, was Sie wollen?

df$Date <- as.Date(df$Date) 
r <- df[(df$Date >= dateFrom & df$Date <= dateTo),] 
data.frame(Date=r$Date, Sum=rowSums(r[-1])) 

#  Date Sum 
#2 2016-09-02 262 
#3 2016-09-03 104 
#4 2016-09-05 220 

Daten

df <- structure(list(Date = c("2016-09-01", "2016-09-02", "2016-09-03", 
"2016-09-05", "2016-09-06"), Value1 = c(20, 200, 60, 150, 140 
), Value2 = c(15, 20, 15, 30, 30), Value3 = c(80, 42, 29, 40, 
39)), .Names = c("Date", "Value1", "Value2", "Value3"), row.names = c(NA, 
-5L), class = "data.frame") 
0

Ich denke, das ist, was Sie wollen (Ihr Feld Datum als Zeichen statt Faktor):

DF2 <- data.frame("Date"=c("2016-09-01","2016-09-02","2016-09-03","2016-09-05","2016-09-06"), 
        "Value1"=c(20,200,60,150,140), 
        "Value2"=c(15,20,15,30,30), 
        "Value3"=c(80,42,29,40,39), stringsAsFactors = FALSE) 

dateFrom <- "2016-09-02" 
dateTo <- "2016-09-05" 
apply(subset(DF2, Date >= dateFrom & Date <= dateTo)[2:4], 2, sum) 
Value1 Value2 Value3 
    410  65 111 
0

Hier ist meine einfache lubdridate Lösung:

library(lubridate) 
interval <- interval(dateFrom, dateTo) 

criteria <- ymd(DF2$Date) %within% interval 


rowSums(DF2[criteria,2:4]) 
# 2 3 4 
#262 104 220 

colSums(DF2[criteria,2:4]) 
# Value1 Value2 Value3 
# 410  65 111 

Ich weiß nicht, ob Sie die Summe der Zeilen (rowSums) oder Spalten (colSums) haben möchten, müssen Sie nur die letzte Zeile des Codes ändern.

Verwandte Themen