Рассчитать среднее число дней в R, используя dplyr, filter, group_by и суммировать? - PullRequest
0 голосов
/ 23 марта 2020

Я хочу создать таблицу, которая показывает средние дни по submit_via (см. Consumer_compliants.csv) с использованием date_diff, вычитания date_sent и date_received. Данные фильтруются, чтобы показать только значения date_diff больше 0. Все это должно быть сделано с использованием dplyr,%>%, filter, group_by и summarise_at, knitr :: kable ()

Я пробовал это в R

date_received <- as.Date(mydata$date_received, "%m/%d/%Y")
date_sent <- as.Date(mydata$date_sent_to_company, "%m/%d/%Y")
date_diff <- (date_sent) - (date_received)

mydata %>%                  
 filter(date_diff > 0) %>%    
 group_by(date_received, date_sent_to_company) %>%   
 summarise(
    a = mean(date_diff))

Вывод:

 Email         11.973214 days           
 Fax           7.057072 days            
 Phone         6.290040 days            
 Postal mail   9.627809 days            
Referral       6.761684 days            
 Web           10.695773 days   

Есть предложения, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

В базе R мы можем сделать следующее:

#select the date columns
cols <- c("date_received", "date_sent_to_company")
#Change the columns to date class
consumer_complaints[cols] <- lapply(consumer_complaints[cols],as.Date,"%m/%d/%Y")

#Suntract values between date_sent_to_company and date_received 
#Select rows where dat_diff is greater than 0 and take mean for each submitted_via
aggregate(date_diff~submitted_via, subset(transform(consumer_complaints, 
          date_diff = date_sent_to_company - date_received), date_diff > 0), mean)

#  submitted_via date_diff
#1         Email    11.97 
#2           Fax     7.06 
#3         Phone     6.29 
#4   Postal mail     9.63 
#5      Referral     6.76 
#6           Web    10.70 
2 голосов
/ 23 марта 2020

Это может быть что-то ближе к тому, что вы хотите:

library(dplyr)

mydata %>%
  mutate_at(vars(starts_with("date_")), as.Date, format = "%m/%d/%Y") %>%
  mutate(date_diff = date_received - date_sent) %>%
  filter(date_diff > 0) %>%    
  group_by(submitted_via) %>%   
  summarise(a = mean(date_diff))

Вывод

# A tibble: 3 x 2
  submitted_via a      
  <fct>         <drtn> 
1 phone         22 days
2 Referral      27 days
3 web            4 days

Данные

mydata <- read.table(
  text =
    "date_received      date_sent   submitted_via
  9/30/2015          9/3/2015      Referral
  9/3/2015           8/30/2015     web
  9/25/2015          9/3/2015      phone
  9/18/2015          9/18/2015     Referral", header = T
)
...