R время подсчета объединенного набора данных между первой покупкой и первым посещением

У меня есть 2 больших набора данных, которые я объединил. Один набор данных содержит информацию о покупках, сделанных покупателями, другой набор данных содержит информацию о посещениях магазина теми же покупателями.

Когда я объединил данные, я сделал это с помощью customer_id, поэтому теперь у меня есть объединенный набор данных, который выглядит так:

#  customer_no       visit date    purchase date
#2       10          20-10-2014         NA 
#3       10              NA         12-01-2013
#4       10          17-06-2011         NA 
#5       10              NA         18-02-2012
#8       30          22-12-2013         NA 
#9       30          14-07-2012         NA 

Я хотел бы создать новую переменную, которая дает мне разницу в днях между ПЕРВЫМ посещением и ПЕРВОЙ покупкой. Таким образом, R должен уметь определять, какая дата является первой в столбце посещений для каждого уникального customer_no, определять, какая дата первая в столбце покупок для того же customer_no, а затем вычислять разницу.

Предположительно, новый столбец будет содержать все NA и одно значение для каждого клиента.

Спасибо!!

Итак, в случае с клиентом № 10 она впервые посетила его 17.06.2011, но совершила первую покупку 18.02.2012 -> 246 дней. Я хотел бы знать среднее значение этого показателя для всех клиентов в объединенном наборе данных.

Спасибо!


person Billaus    schedule 23.10.2014    source источник
comment
Я думаю, у вас может быть ошибочное имя столбца там   -  person Rich Scriven    schedule 24.10.2014
comment
Правда! Исправлено, спасибо!   -  person Billaus    schedule 27.10.2014


Ответы (2)


Что-то вроде этого должно помочь:

library(dplyr)
df %>% group_by(customer_no) %>% 
  summarize(diff = min(as.numeric(as.Date(purchase_date, format = "%d-%m-%Y")), na.rm=T) - 
                   min(as.numeric(as.Date(visit_date, format = "%d-%m-%Y")), na.rm=T))
person petew    schedule 23.10.2014
comment
Ммм, это не работает, или я делаю что-то не так. Это сообщение, которое я получаю: n min (as.numeric (as.Date (structure (c (1191L, NA, NA, NA, ...: без пропущенных аргументов для min; возвращение Inf) Альтернативой было бы создание новый столбец (новая переменная), который для каждого клиента дает мне разницу между первым посещением и первой покупкой. Что касается каждого клиента, у меня есть несколько строк (все посещения и все покупки), в этих новых столбцах у меня будет одна ячейка с количеством дней между первым посещением и первой покупкой, а все остальные будут иметь NA. - person Billaus; 29.10.2014

Это решение не очень элегантно, но, насколько я понимаю ваш запрос, оно выводит фрейм данных, который вы хотели бы видеть. Цикл for в этом примере генерирует предупреждение, потому что у клиента 30 нет purchase_date, тогда мы пытаемся получить разницу между датой и NA, но это нормально, поскольку результат - другой NA.

df <- data.frame(customer_no = c(10, 10, 10, 10, 30, 30),
                 visit_date = c("20-10-2014", NA, "17-06-2011", NA, "22-12-2013", "14-07-2012"),
                 purchase_date = c(NA, "12-01-2013", NA, "18-02-2012", NA, NA))

df$diff <- rep(NA, nrow(df)) 


customers <- unique(df$customer_no)
diff_first_visit_purchase <- data.frame()

for (customer in customers) {
  sub.df <- subset(df, customer_no == customer)
  first_visit <- min(as.Date(sub.df$visit_date, format="%d-%m-%Y"), na.rm=TRUE)
  first_purchase <- min(as.Date(sub.df$purchase_date, format="%d-%m-%Y"), na.rm=TRUE)
  temp.df <- data.frame(customer_no = customer,
                        visit_date = NA,
                        purchase_date = NA,
                        diff = as.integer(first_purchase - first_visit))
  diff_first_visit_purchase <- rbind(diff_first_visit_purchase, temp.df)

}


final.df <- rbind(df, diff_first_visit_purchase)
final.df <- final.df[order(final.df$customer_no),]

final.df
#  customer_no visit_date purchase_date diff
#1          10 20-10-2014          <NA>   NA
#2          10       <NA>    12-01-2013   NA
#3          10 17-06-2011          <NA>   NA
#4          10       <NA>    18-02-2012   NA
#7          10       <NA>          <NA>  246
#5          30 22-12-2013          <NA>   NA
#6          30 14-07-2012          <NA>   NA
#8          30       <NA>          <NA>   NA

mean(final.df$diff, na.rm=TRUE)
#[1] 246
person CptNemo    schedule 29.10.2014