Суммирование строк по различному количеству столбцов в R

У меня есть фрейм данных, состоящий из одной строки для каждого пользователя. Для каждого пользователя у меня есть информация о том, когда он впервые зашел на веб-сайт (строка 1), и за каждый последующий день (каждый день — это столбец), сколько раз в день они заходили на сайт.

Я хотел бы создать новый столбец, в котором будет указано, сколько раз в течение 7 дней после первого входа в систему пользователь входил на веб-сайт. Этот 7-дневный период отличается для каждого пользователя.

Я хотел бы сделать цикл for, но не знаю, как внести изменения, чтобы включить различные имена столбцов для этого суммирования.

tibble(id=c(1:4), first_log = c("18-12-01", "18-12-02", "18-12-02",
"18-12-05"), X18_12_01 = c(NA,1,1,2), X18_12_02 = c(5,2,1,1))

Конечно, набор данных имеет гораздо больше таких же столбцов и строк.


person Nina    schedule 04.03.2019    source источник
comment
В предоставленных данных пользователи имеют входы в систему до даты их первого входа в систему. См. идентификаторы 2-4   -  person Calum You    schedule 04.03.2019
comment
Да, это первый вход в систему после того, как мы изменили что-то существенное в содержании веб-сайта.   -  person Nina    schedule 04.03.2019


Ответы (2)


С любым количеством столбцов даты после first_login мы можем сделать следующее.

  1. gather столбцы даты в один столбец, чтобы мы могли работать с ним удобно. Это аккуратный формат, в котором каждая строка представляет собой комбинацию пользовательского дня.
  2. Преобразуйте даты в объекты Date и определите количество дней между наблюдением и first_log. Для этого мы используем Interval, чтобы обеспечить разумное поведение при нарушениях временной шкалы.
  3. filter чтобы сохранить только те наблюдения, которые произошли в желаемом недельном диапазоне
  4. summarise, чтобы рассчитать общее количество входов в систему за этот период, и right_join значения возвращаются к исходным. Обратите внимание, что без дополнительных примеров данных трудно быть более наглядным, поскольку здесь фактически суммируется только одна ячейка, и поэтому только пользователь с id = 1 фактически имеет какие-либо значения для суммирования.
library(tidyverse)
library(lubridate)

tbl <- tibble(id = c(1:4), first_log = c("18-12-01", "18-12-02", "18-12-02", "18-12-05"), X18_12_01 = c(NA, 1, 1, 2), X18_12_02 = c(5, 2, 1, 1))

tbl %>%
  gather(day, num_logins, -id, -first_log) %>%
  mutate(
    first_log = ymd(first_log),
    day = day %>% str_remove("^X") %>% ymd(),
    days_since_event = as.period(first_log %--% day, "day"),
  ) %>%
  filter(days_since_event > days(0) & days_since_event <= days(7)) %>%
  group_by(id) %>%
  summarise(total_logins = sum(num_logins, na.rm = TRUE)) %>%
  right_join(tbl, by = "id")
#> # A tibble: 4 x 5
#>      id total_logins first_log X18_12_01 X18_12_02
#>   <int>        <dbl> <chr>         <dbl>     <dbl>
#> 1     1            5 18-12-01         NA         5
#> 2     2           NA 18-12-02          1         2
#> 3     3           NA 18-12-02          1         1
#> 4     4           NA 18-12-05          2         1

Создано 04 марта 2019 г. с помощью пакета reprex (v0.2.1)

person Calum You    schedule 04.03.2019

Предполагая, что у вас есть только 7 столбцов после first_log, это будет суммировать общее количество раз, когда вы вошли в систему в течение промежутка времени, который у вас есть по столбцам. В приведенном ниже примере показано только общее количество входов пользователя в систему в течение 2 дней.

library(tidyverse)


tibble(id=c(1:4), 
       first_log = c("18-12-01", 
                     "18-12-02", 
                     "18-12-02",
                     "18-12-05"), 
       X18_12_01 = c(NA,1,1,2), 
       X18_12_02 = c(5,2,1,1)) %>% 
  gather(key = "days", value = "times_visted", 3:length(.)) %>% 
  group_by(id) %>% 
  summarise(total_visits = sum(times_visted, na.rm = T))
#> # A tibble: 4 x 2
#>      id total_visits
#>   <int>        <dbl>
#> 1     1            5
#> 2     2            3
#> 3     3            2
#> 4     4            3

Создано 04 марта 2019 г. с помощью пакета reprex (v0.2.1)

person dylanjm    schedule 04.03.2019