Выполнение в групповых операциях в R - PullRequest
0 голосов
/ 27 июня 2018

У меня есть данные, в которых у меня есть 2 поля в таблице sf -> Customer id и Buy_date. Buy_date уникально, но для каждого клиента, но может быть более 3 различных значений Buy_dates для каждого клиента. Я хочу рассчитать разницу в последовательных Buy_date для каждого Customer и его среднего значения. Как я могу это сделать.

Пример

Customer   Buy_date
1          2018/03/01
1          2018/03/19
1          2018/04/3
1          2018/05/10
2          2018/01/02
2          2018/02/10
2          2018/04/13

Я хочу получить результаты для каждого клиента в формате

Customer  mean

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Я не совсем уверен в желаемом выводе, но это то, что я думаю, вы хотите.

library(dplyr)
library(zoo)
dat <- read.table(text = 
"Customer   Buy_date
1          2018/03/01
1          2018/03/19
1          2018/04/3
1          2018/05/10
2          2018/01/02
2          2018/02/10
2          2018/04/13", header = T, stringsAsFactors = F)


dat$Buy_date <- as.Date(dat$Buy_date)

dat %>% group_by(Customer) %>% mutate(diff_between = as.vector(diff(zoo(Buy_date), na.pad=TRUE)), 
                                      mean_days = mean(diff_between, na.rm = TRUE))

Это производит:

    Customer Buy_date   diff_between mean_days
     <int> <date>            <dbl>     <dbl>
1        1 2018-03-01           NA      23.3
2        1 2018-03-19           18      23.3
3        1 2018-04-03           15      23.3
4        1 2018-05-10           37      23.3
5        2 2018-01-02           NA      50.5
6        2 2018-02-10           39      50.5
7        2 2018-04-13           62      50.5

ИЗМЕНЕНО НА ОСНОВЕ КОММЕНТАРИЙ ПОЛЬЗОВАТЕЛЯ:

Поскольку вы сказали, что у вас есть факторы, а не символы, просто конвертируйте их, выполнив следующее:

dat$Buy_date <- as.Date(as.character(dat$Buy_date))
dat$Customer <- as.character(dat$Customer)
0 голосов
/ 27 июня 2018

Вот решение dplyr.

Ваши данные:

df <- data.frame(Customer = c(1,1,1,1,2,2,2), Buy_date = c("2018/03/01", "2018/03/19", "2018/04/3", "2018/05/10", "2018/01/02", "2018/02/10", "2018/04/13"))

Группировка, Среднее Buy_date Расчет и суммирование:

library(dplyr)
df %>% group_by(Customer) %>% mutate(mean = mean(as.POSIXct(Buy_date))) %>% group_by(Customer, mean) %>% summarise()

Выход:

# A tibble: 2 x 2
# Groups:   Customer [?]
  Customer mean               
     <dbl> <dttm>             
1        1 2018-03-31 06:30:00
2        2 2018-02-17 15:40:00

Или, как @ r2evans указывает в своем комментарии на дней подряд между Buy_date s :

df %>% group_by(Customer) %>% mutate(mean = mean(diff(as.POSIXct(Buy_date)))) %>% group_by(Customer, mean) %>% summarise()

Выход:

# A tibble: 2 x 2
# Groups:   Customer [?]
  Customer mean            
     <dbl> <time>          
1        1 23.3194444444444
2        2 50.4791666666667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...