Как суммировать «Количество дней с первой даты» и «Количество дней, увиденных» по идентификатору и для большого фрейма данных - PullRequest
0 голосов
/ 08 июля 2019

Фрейм данных df1 суммирует обнаружения отдельных лиц (ID) за время (Date). В качестве краткого примера:

df1<- data.frame(ID= c(1,2,1,2,1,2,1,2,1,2),
                 Date= ymd(c("2016-08-21","2016-08-24","2016-08-23","2016-08-29","2016-08-27","2016-09-02","2016-09-01","2016-09-09","2016-09-01","2016-09-10")))

df1

   ID       Date
1   1 2016-08-21
2   2 2016-08-24
3   1 2016-08-23
4   2 2016-08-29
5   1 2016-08-27
6   2 2016-09-02
7   1 2016-09-01
8   2 2016-09-09
9   1 2016-09-01
10  2 2016-09-10

Я хочу суммировать либо Number of days since the first detection of the individual (Ndays), либо Number of days that the individual has been detected since the first time it was detected (Ndifdays).

Кроме того, я хотел бы включить в эту сводную таблицу переменную с именем Prop, которая просто делит Ndifdays между Ndays.

Сводная таблица, которую я ожидаю, будет такой:

> Result
  ID Ndays Ndifdays  Prop
1  1    11        4 0.360 # Between 21st Aug and 01st Sept there is 11 days.
2  2    17        5 0.294 # Between 24th Aug and 10st Sept there is 17 days.

Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Вы можете достичь, используя различные функции суммирования в dplyr

library(dplyr)

df1 %>%
   group_by(ID) %>%
   summarise(Ndays =  as.integer(max(Date) - min(Date)), 
             Ndifdays = n_distinct(Date), 
             Prop = Ndifdays/Ndays)

#     ID Ndays Ndifdays  Prop
#   <dbl> <int>    <int> <dbl>
#1     1    11        4 0.364
#2     2    17        5 0.294

data.table версия этого будет

library(data.table)
df12 <- setDT(df1)[, .(Ndays = as.integer(max(Date) - min(Date)), 
                       Ndifdays = uniqueN(Date)), by = ID]
df12$Prop <- df12$Ndifdays/df12$Ndays

и база R с aggregate

df12 <- aggregate(Date~ID, df1, function(x) c(max(x) - min(x), length(unique(x))))
df12$Prop <- df1$Ndifdays/df1$Ndays
0 голосов
/ 08 июля 2019

После группировки по 'ID', получите diff или range из 'Date', чтобы создать 'Ndays', а затем получите уникальное число 'Date' с n_distinct, разделенное на число различных по Ndays, чтобы получить «Опора»

library(dplyr)    
df1 %>%
   group_by(ID) %>%
   summarise(Ndays =  as.integer(diff(range(Date))), 
         Ndifdays = n_distinct(Date), 
         Prop = Ndifdays/Ndays)
# A tibble: 2 x 4
#     ID Ndays Ndifdays  Prop
#  <dbl> <int>    <int> <dbl>
#1     1    11        4 0.364
#2     2    17        5 0.294
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...