Перечислите день посещения патрона и суммируйте их дни отставания в R - PullRequest
2 голосов
/ 21 апреля 2020

Я новичок в R, и я хотел бы спросить, как преобразовать приведенный ниже набор данных в две таблицы результатов, которые

  1. имеют уникальное имя в качестве строки и перечисляют поездку 1 , 2, 3, 4, 5 и т. Д. Каждого человека, и в среднем столбец итоговой суммы в последнем столбце n строке.

  2. Вторая таблица, которую я хочу знать, дни отставания между поездками и средним День отставания каждого человека в качестве последнего столбца. Лаг - это день между поездками.

Набор данных

name <- c('Mary', 'Sue', 'Peter', 'Mary', 'Mary', 'John', 'Sue', 'Peter',
          'Peter', 'John', 'John', 'John', 'Mary', 'Mary')
date <- c('01/04/2018', '03/02/2017', '01/01/2019', '24/04/2017', 
          '02/03/2019', '31/05/2019', '08/09/2019', '17/12/2019', 
          '02/08/2017', '10/11/2017', '30/12/2017', '18/02/2018', 
          '18/02/2018', '18/10/2019')
data <- data.frame(name, date)

Желаемые результаты:

Result 1

Name  Trip 1        Trip2     Total trips
Mary  dd/mm/yyyy   dd/mm/yyyy   2
John  dd/mm/yyyy.   N/A         1
Total Trip  2        1          3

Result 2
Name Lag1 Lag2 Avg.Lag
Mary  3    4    3.5
John  5    1     3

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Результат 1 можно получить, упорядочив данные по дате (сначала преобразовав в формат даты) и выполнив group_by () для каждого человека, чтобы рассчитать ранг и количество поездок. Затем их можно развернуть в столбцы, используя pivot_wider() из пакета tidyr (строки paste0() должны обеспечивать читаемые имена столбцов).

Для результата 2 необходимо рассчитать разницу в днях между поездками, используя difftime(), что даст NA для первой поездки. Остальная часть процедуры похожа на результат 1, но некоторые столбцы должны быть удалены перед сводкой.

library(dplyr)
library(tidyr)

name <- c('Mary','Sue','Peter','Mary','Mary','John','Sue','Peter','Peter','John',
          'John','John','Mary','Mary')
date <- c('01/04/2018','03/02/2017','01/01/2019','24/04/2017',
          '02/03/2019','31/05/2019','08/09/2019','17/12/2019',
          '02/08/2017','10/11/2017','30/12/2017','18/02/2018',
          '18/02/2018','18/10/2019')

data <- data.frame(name,date, stringsAsFactors = F)

data <- data %>% 
  mutate(date = as.Date(date, format = '%d/%m/%Y')) %>% 
  arrange(name, date) %>% 
  group_by(name) %>%
  mutate(trip_nr = rank(date),
         total_trips = n()) %>% 
  ungroup() 

result1 <- data %>% 
  mutate(trip_nr = paste0('Trip_', trip_nr)) %>% 
  pivot_wider(names_from = trip_nr, values_from = date)

result2 <- data %>% 
  group_by(name) %>% 
  mutate(lag = difftime(date, lag(date), units = 'days'),
         lag_avg = mean(lag, na.rm = T)) %>% 
  ungroup() %>%
  filter(!is.na(lag)) %>% 
  mutate(lag_nr = paste0('Lag_', trip_nr-1)) %>% 
  select(-date,-trip_nr,-total_trips) %>% 
  pivot_wider(names_from = lag_nr, values_from = lag)

Это дает результат для result1:

# A tibble: 4 x 7
  name  total_trips Trip_1     Trip_2     Trip_3     Trip_4     Trip_5    
  <chr>       <int> <date>     <date>     <date>     <date>     <date>    
1 John            4 2017-11-10 2017-12-30 2018-02-18 2019-05-31 NA        
2 Mary            5 2017-04-24 2018-02-18 2018-04-01 2019-03-02 2019-10-18
3 Peter           3 2017-08-02 2019-01-01 2019-12-17 NA         NA        
4 Sue             2 2017-02-03 2019-09-08 NA         NA         NA        

и result2:

# A tibble: 4 x 6
# Groups:   name [4]
  name  lag_avg     Lag_1    Lag_2    Lag_3    Lag_4   
  <chr> <drtn>      <drtn>   <drtn>   <drtn>   <drtn>  
1 John  189.00 days  50 days  50 days 467 days  NA days
2 Mary  226.75 days 300 days  42 days 335 days 230 days
3 Peter 433.50 days 517 days 350 days  NA days  NA days
4 Sue   947.00 days 947 days  NA days  NA days  NA days
0 голосов
/ 21 апреля 2020
enter code here
data$date <- as.character(data$date)
data <- data[order(as.Date(data$date,"%d/%m/%Y")),]
data <- data.table(data)
data[,date := as.Date(date,"%d/%m/%Y")]
#trips
data[,Trips:=seq(.N),by="name"]
#time diff in "days" between trips
data[,Lag:=shift(date,1),by="name"]
data[,diff:=difftime(Lag,date,"days"),by="name"]
data[,diff:=abs(as.numeric(diff))]
#creating second summary table
data_summary_second_table <- data[,.(Avg_lag=mean(diff,na.rm = TRUE)),by="name"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...