【问题标题】:Summing rows over varying amount of columns in R在R中对不同数量的列求和
【发布时间】:2019-03-04 19:25:17
【问题描述】:

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

当然,数据集有更多的列和行。

【问题讨论】:

  • 在提供的数据中,用户在首次登录日期之前已经登录。参见 ids 2-4
  • 是的,这是我们对网站内容进行重大更改后的第一次登录。

标签: r loops rowsum


【解决方案1】:

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 年 3 月 4 日创建

【讨论】:

    【解决方案2】:

    假设您在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 年 3 月 4 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      相关资源
      最近更新 更多