рассчитать продолжительность в сложной таблице - PullRequest
1 голос
/ 26 февраля 2020

У меня есть таблица, как показано.

df <- data.frame("name" = c("jack", "william", "david", "john"), 
                 "01-Jan-19" = c(NA,"A",NA,"A"),
                 "01-Feb-19" = c("A","A",NA,"A"),
                 "01-Mar-19" = c("A","A","A","A"),
                 "01-Apr-19" = c("A","A","A","A"),
                 "01-May-19" = c(NA,"A","A","A"),
                 "01-Jun-19" = c("A","SA","A","SA"),
                 "01-Jul-19" = c("A","SA","A","SA"),
                 "01-Aug-19" = c(NA,"SA","A","SA"),
                 "01-Sep-19" = c(NA,"SA","A","SA"),
                 "01-Oct-19" = c("SA","SA","A","SA"),
                 "01-Nov-19" = c("SA","SA",NA,"SA"),
                 "01-Dec-19" = c("SA","SA","SA",NA),
                 "01-Jan-20" = c("SA","M","A","M"),
                 "01-Feb-20" = c("M","M","M","M"))

В течение определенного периода времени каждый человек проходит через прогрессирование позиции (3 категории позиции от A до SA до M). Моя цель: Рассчитать среднюю продолжительность позиции A (ассистент) и SA (старший ассистент). т. е. продолжительность между датой появления первой в одной категории и датой появления последней в этой категории, независимо от того, отсутствуют ли промежуточные данные. Я транспонировал данные, используя функцию «собрать» R

df1 <- gather (df, "date", "position", 2:15)

, тогда я не уверен, как лучше поступить. Что может быть лучшим способом дальнейшего подхода к этому?

1 Ответ

1 голос
/ 26 февраля 2020

Мы можем получить данные в более длинном формате и рассчитать количество дней между первой датой, когда человек был "SA", и первой датой, когда он был "A".

library(dplyr)

df %>%
  tidyr::pivot_longer(cols = -name, names_to = 'person', values_drop_na = TRUE) %>%
  mutate(person = dmy(person)) %>%
  group_by(name) %>%
  summarise(avg_duration = person[match('SA', value)] - person[match('A', value)]) 

#  name    duration
#  <fct>   <drtn>  
#1 david   275 days
#2 jack    242 days
#3 john    151 days
#4 william 151 days

При необходимости среднее значение мы можем pull, а затем рассчитать среднее, добавив к приведенной выше цепочке

%>% pull(duration) %>% mean
#Time difference of 204.75 days

данные

df <- structure(list(name = c("jack", "william", "david", "john"), 
`01-Jan-19` = c(NA, "A", NA, "A"), `01-Feb-19` = c("A", "A", 
NA, "A"), `01-Mar-19` = c("A", "A", "A", "A"), `01-Apr-19` = c("A", 
"A", "A", "A"), `01-May-19` = c(NA, "A", "A", "A"), `01-Jun-19` = c("A", 
"SA", "A", "SA"), `01-Jul-19` = c("A", "SA", "A", "SA"), 
`01-Aug-19` = c(NA, "SA", "A", "SA"), `01-Sep-19` = c(NA, 
"SA", "A", "SA"), `01-Oct-19` = c("SA", "SA", "A", "SA"), 
`01-Nov-19` = c("SA", "SA", NA, "SA"), `01-Dec-19` = c("SA", 
"SA", "SA", NA), `01-Jan-20` = c("SA", "M", "A", "M"), `01-Feb-20` = c("M", 
"M", "M", "M")), row.names = c(NA, -4L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...