2015-02-20 3 views
0
custid <- c(1,2,2,2) 

prod <- c("books", "highlighters", "books", "pens") 

qdate <- c(20130401, 20130403, 20130403, 20130404) 

tdate <- c(20130405, 20130804, 20130405, 20130405) 

data <- data.frame(custid, prod, qdate, tdate) 

    data$qdate <- as.Date(as.character(data$qdate), "%Y%m%d") 
    data$tdate <- as.Date(as.character(data$tdate), "%Y%m%d") 

(data2 <- difftime(data$tdate, data$qdate, data$custid, units="days")) #works 

data2 <- aggregate(cbind(data$tdate=format(date, '%Y-%m-%d'))~cbind(data$qdate=format(date, '%Y-%m-%d')) + data$prod + data$custid, data, difftime(data$tdate, data$qdate, data$custid, units="days")) 

Для приведенного выше кода R, я пытаюсь использовать функцию агрегата, чтобы найти выход, как показано ниже. Дифференциал правильно определяет дни. Однако агрегатные функции не работают и вызывают ошибки. Кто-нибудь знает, как решить эту проблему? Благодарю.Разница между датами для каждого клиента и продукта в R

custid prod   qdate  tdate  days_difference 
1  books   20130401 20130405 4 
2  highlighters 20130403 20130804 123 
2  books   20130403 20130405 2 
2  pens   20130404 20130405 1 

ответ

2

Вы можете сделать это намного проще, начав использовать lubridate

library(lubridate) 
custid <- c(1,2,2,2) 

prod <- c("books", "highlighters", "books", "pens") 

# ymd = year, month, day 
qdate <- ymd(c(20130401, 20130403, 20130403, 20130404)) 

tdate <- ymd(c(20130405, 20130804, 20130405, 20130405)) 

data <- data.frame(custid, prod, qdate, tdate) 
data$days_difference <- with(data, difftime(tdate, qdate, units="days")) 
data 
    custid   prod  qdate  tdate days_difference 
1  1  books 2013-04-01 2013-04-05   4 days 
2  2 highlighters 2013-04-03 2013-08-04  123 days 
3  2  books 2013-04-03 2013-04-05   2 days 
4  2   pens 2013-04-04 2013-04-05   1 days 

EDIT

Если вы не хотите 'дней' в колонке использовать as.numeric

data$days_difference <- as.numeric(with(data, difftime(tdate, qdate, custid, units="days"))) 
    custid   prod  qdate  tdate days_difference 
1  1  books 2013-04-01 2013-04-05    4 
2  2 highlighters 2013-04-03 2013-08-04    123 
3  2  books 2013-04-03 2013-04-05    2 
4  2   pens 2013-04-04 2013-04-05    1 
+0

Оба cdeterman и @Richard Scriven работают. Спасибо, ребята, так много. В столбце days_difference, как мне не включать «дни»? – sharp

+0

Просто используйте 'as.numeric' – cdeterman

2

Вам не нужен aggregate() для расчета по строке. Вы можете использовать унарный оператор - в классах «Дата». Оберните его в c(), чтобы удалить класс «difftime».

within(data, day_diff <- c(tdate - qdate)) 
# custid   prod  qdate  tdate day_diff 
# 1  1  books 2013-04-01 2013-04-05  4 
# 2  2 highlighters 2013-04-03 2013-08-04  123 
# 3  2  books 2013-04-03 2013-04-05  2 
# 4  2   pens 2013-04-04 2013-04-05  1 
Смежные вопросы