How to summarize `Number of days since first date` and `Number of days seen` by ID and for a large data frame

扶醉桌前 提交于 2019-12-13 22:30:28

问题


The dataframe df1 summarizes detections of individuals (ID) through the time (Date). As a short example:

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

I want to summarize either the Number of days since the first detection of the individual (Ndays) and Number of days that the individual has been detected since the first time it was detected (Ndifdays).

Additionally, I would like to include in this summary table a variable called Prop that simply divides Ndifdays between Ndays.

The summary table that I would expect would be this:

> 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.

Does anyone know how to do it?


回答1:


You could achieve using various summarising functions in 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

The data.table version of this would be

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

and base R with aggregate

df12 <- aggregate(Date~ID, df1, function(x) c(max(x) - min(x), length(unique(x))))
df12$Prop <- df1$Ndifdays/df1$Ndays



回答2:


After grouping by 'ID', get the diff or range of 'Date' to create 'Ndays', and then get the unique number of 'Date' with n_distinct, divide by the number of distinct by the Ndays to get the 'Prop'

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


来源:https://stackoverflow.com/questions/56931816/how-to-summarize-number-of-days-since-first-date-and-number-of-days-seen-by

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!