2016-10-06 6 views
-2

У меня есть следующий кадр данных с указанием даты и значения столбцов:Агрегация на основе диапазона дат

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

Тогда у меня есть две даты ввода параметров:

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

Как можно агрегировать каждый числовой столбец (Value1 - Value3) на основе этого диапазона дат? Я хотел бы вычислить простую сумму как критерий агрегации. Большое спасибо за ваш совет в переезде.

ответ

0

Данные:

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

Использование dplyr:

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

Edit: изменить тип для даты (в формате Date) непосредственно в DF2. Если вы этого не сделаете, вам необходимо:

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

Большое вам спасибо. Ваши ответы действительно замечательные !!!! Я собираюсь использовать подход Хаборима, кажется, лучше для моих целей. – martinkabe

+0

Дополнительный вопрос ... как преобразовать результат в кадр данных? – martinkabe

+0

, если вы сохраните результаты в Result, вы можете сделать: 'data.frame (t (Result), row.names = NULL)'. – Haboryme

1

Он должен работать. Данные должны быть упорядочены по дате.

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

Это то, что вы хотите?

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 

данные

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

Я думаю, что это то, что вы хотите (иметь свой Date поле символа вместо фактора):

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

Вот мое простое lubdridate решение:

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 

Я не знаю, хотите ли вы иметь сумму строк (rowSums) или столбцы (colSums), вам просто нужно изменить последнюю строку кода.

Смежные вопросы