在R中不同数量的列上汇总行

时间:2019-03-04 19:25:18

标签: r loops rowsum

我有一个数据框,每个用户由一行组成。对于每个用户,我都有他们首次登录网站时的信息(第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))

当然,数据集具有更多的列和行,就像这样。

2 个答案:

答案 0 :(得分:0)

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

reprex package(v0.2.1)于2019-03-04创建

答案 1 :(得分:-1)

假设first_log之后只有7列,那么这将对您跨列的时间跨度内登录的总时间求和。在下面的示例中,它仅显示用户在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

reprex package(v0.2.1)于2019-03-04创建