получение уникального количества пользователей за последние 7 дней - PullRequest
1 голос
/ 21 апреля 2020

У меня есть набор данных, в котором я хотел бы найти активных людей за последние 7 дней (то есть за последние 7 дней). Например,

     date<- c('2009-01-03', '2009-01-03', '2009-01-03', '2009-01-04', '2009-01-05', '2009-02-01')
     person<- c('Abe', 'John', 'Abe', 'Kate', 'Jessica', 'Anu')
     df<- data.frame(date, person)

Я хотел создать столбец с именем last_seven_days_active, в который будет записан уникальный счет всех людей, которые были активны за последние 7 дней.

     last_seven_days_active
           0
           0
           0
           2
           3
           0

Я пробовал это. Какие-либо предложения?

   library(zoo)
   df$last_seven_days_active <- rollsumr(df$person, k = 8, fill = NA)

Ответы [ 3 ]

2 голосов
/ 21 апреля 2020

Опция с between и map

library(dplyr)
library(purrr)
df %>%
    mutate(last_seven_days_active = map_dbl(as.Date(date), 
         ~ n_distinct(person[between(date, .x - 7, .x) & date != .x] )))
#       date  person last_seven_days_active
#1 2009-01-03     Abe                      0
#2 2009-01-03    John                      0
#3 2009-01-03     Abe                      0
#4 2009-01-04    Kate                      2
#5 2009-01-05 Jessica                      3
#6 2009-02-01     Anu                      0
2 голосов
/ 21 апреля 2020

Опция, использующая data.table:

library(data.table)
setDT(df)[, date := as.IDate(date, format="%Y-%m-%d")]
df[, days7ago := date - 7L]
df[, last_seven_days_active := 
    df[df, on=.(date>=days7ago, date<date), by=.EACHI, 
        length(unique(person[!is.na(person)]))]$V1
]

, вывод:

         date  person   days7ago last_seven_days_active
1: 2009-01-03     Abe 2008-12-27                      0
2: 2009-01-03    John 2008-12-27                      0
3: 2009-01-03     Abe 2008-12-27                      0
4: 2009-01-04    Kate 2008-12-28                      2
5: 2009-01-05 Jessica 2008-12-29                      3
6: 2009-02-01     Anu 2009-01-25                      0
2 голосов
/ 21 апреля 2020

A base решение:

df$date <- as.Date(as.character(df$date))

df$last_seven_days_active <- with(df, sapply(date, function(x) length(unique(person[date >= x - 7 & date < x]))))

Выход:

        date  person last_seven_days_active
1 2009-01-03     Abe                      0
2 2009-01-03    John                      0
3 2009-01-03     Abe                      0
4 2009-01-04    Kate                      2
5 2009-01-05 Jessica                      3
6 2009-02-01     Anu                      0
...