对 R 中不同列数的行求和
Summing rows over varying amount of columns in 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))
当然,数据集有更多的列和行。
假设您在 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 创建
在 first_login
之后有任意数量的日期列,我们可以执行以下操作。
gather
把日期列合并成一个列这样我们实际操作上就方便了。这是一个整洁的格式,每一行都是用户天的组合。
- 将日期转换为
Date
对象,并计算出观察和 first_log
之间的天数。我们使用 Interval
来执行此操作,以确保围绕时间线不规则行为采取明智的行为。
filter
仅保留在所需周范围内发生的观察结果
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 行)以及之后的每一天(每一天都是一列)他们每天登录多少次的信息。
我想创建一个新列,告诉我用户在首次登录后 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))
当然,数据集有更多的列和行。
假设您在 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 创建在 first_login
之后有任意数量的日期列,我们可以执行以下操作。
gather
把日期列合并成一个列这样我们实际操作上就方便了。这是一个整洁的格式,每一行都是用户天的组合。- 将日期转换为
Date
对象,并计算出观察和first_log
之间的天数。我们使用Interval
来执行此操作,以确保围绕时间线不规则行为采取明智的行为。 filter
仅保留在所需周范围内发生的观察结果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 创建