Найти количество дней с момента первого обращения

#r #economics

#r #экономика

Вопрос:

  Example:   
    FIPS       Date     Counts 
    1001       Jan_22    0
    1003       Jan_22    1
    1004       Jan_22    0
    1001       Jan_23    1
    1003       Jan_23    5
    1004       Jan_23    0
    1001       Jan_24    6
    1003       Jan_24    10
    1004       Jan_24    1 
    1001       Jan_25    8
    1003       Jan_25    12
    1004       Jan_25    3
    1001       April_1   20
    1003       April_1   60
    1004.      April_1   50
    
Result:
        FIPS   Date    Counts  DaysSinceFirst
        1001   Jan_23   1      98
        1003   Jan_22   1      99
        1004   Jan_24   1      97
  

Я пытаюсь найти количество дней с момента 1-го случая Covid-19 в разных округах Соединенных Штатов. Мне нужно найти первое вхождение 1 случая, подтвержденного в этом округе, а затем заставить R сообщить мне для каждого кода FIPS, на какую дату это было в первый день, когда это было подтверждено для 1 случая. Я делаю все 3141 округ. Даты идут от Jan_22 до April_30.

Я использовал

  data_long %>%
  filter(Counts > 0) %>%
  group_by(FIPS) %>%
  slice(1L)
  

чтобы получить

 FIPS   Date    Counts  
 1001   Jan_23   1      
 1003   Jan_22   1      
 1004   Jan_24   1   
  

Но мне все еще нужно количество дней с момента первого подтвержденного обращения.

Ответ №1:

Вы можете получить разницу между каждой датой и 30 апреля, а затем применить оставшуюся часть кода.

 library(dplyr)

last_date <- as.Date('2020-04-30')

df %>%
  mutate(Date = lubridate::mdy(paste(Date, 2020,sep = '_')), 
         DaysSinceFirst = as.numeric(last_date - Date)) %>%
         #If the last date needs to be taken from the data.
         #DaysSinceFirst = as.numeric(max(last_date) - Date)) %>%
  filter(Counts > 0) %>%
  group_by(FIPS) %>%
  slice(1L)

#   FIPS Date       Counts DaysSinceFirst
#  <int> <date>      <int>          <dbl>
#1  1001 2020-01-23      1             98
#2  1003 2020-01-22      1             99
#3  1004 2020-01-24      1             97
  

Ответ №2:

Работает ли это:

 library(dplyr)
df %>% mutate(date = paste('2020',Date, sep = '_')) %>%  filter(Counts > 0) %>% 
mutate(date = lubridate::ymd(date)) %>% arrange(FIPS,date) %>% group_by(FIPS) %>% filter(row_number() == 1) %>% 
mutate(DaysSinceFirst = difftime(lubridate::ymd('2020-04-30'), date, units = 'days'))
# A tibble: 3 x 5
# Groups:   FIPS [3]
   FIPS Date   Counts date       DaysSinceFirst
  <dbl> <chr>   <dbl> <date>     <drtn>        
1  1001 Jan_23      1 2020-01-23 98 days       
2  1003 Jan_22      1 2020-01-22 99 days       
3  1004 Jan_24      1 2020-01-24 97 days