上个月的计算——有条件
Calculation for last month -- with conditions
在我的数据集中,我每个月在不同的地方对不同的人进行观察。我想创建一个新列,它是:上个月除当前行的位置之外,此人访问过的所有位置的平均值 value
。因此,例如,第 6 行将是第 2-5 行的平均值(上个月在不是 A
的地方)。
在我的实际数据集中,数据是不平衡的——并且用户在不同的月份被观察——所以任何解决方案都不一定依赖于它。
library(tidyr)
# Generate people, places, and dates
people <- letters[1:3]
places <- LETTERS[1:5]
dates <- seq(as.Date("2020/01/04"), by = "month", length.out = 3)
# Now cross data so there is observation for each person, for each place, for each month
crossed <- crossing(people, dates, places)
# Add random values
crossed$value <- rnorm(nrow(crossed), 2)
这是数据的样子
people dates places value
<chr> <date> <chr> <dbl>
1 a 2020-01-04 A 2.94
2 a 2020-01-04 B 1.74
3 a 2020-01-04 C 2.68
4 a 2020-01-04 D 3.96
5 a 2020-01-04 E 0.821
6 a 2020-02-04 A 1.86
7 a 2020-02-04 B 1.04
8 a 2020-02-04 C 1.51
9 a 2020-02-04 D 3.62
10 a 2020-02-04 E 1.81
如果每个月的日期始终恰好相隔一个月,则此方法有效。如果没有,您将不得不修改 dates == .y - months(1)
,但一般方法是相同的。
library(tidyverse)
set.seed(1)
crossed %>%
group_by(people) %>%
mutate(
new_val = map2_dbl(
places,
dates,
~ mean(value[places != .x & dates == .y - months(1)]))
) %>%
ungroup()
输出:
# A tibble: 45 x 5
people dates places value new_val
<chr> <date> <chr> <dbl> <dbl>
1 a 2020-01-04 A 1.37 NaN
2 a 2020-01-04 B 2.18 NaN
3 a 2020-01-04 C 1.16 NaN
4 a 2020-01-04 D 3.60 NaN
5 a 2020-01-04 E 2.33 NaN
6 a 2020-02-04 A 1.18 2.32
7 a 2020-02-04 B 2.49 2.12
8 a 2020-02-04 C 2.74 2.37
9 a 2020-02-04 D 2.58 1.76
10 a 2020-02-04 E 1.69 2.08
# ... with 35 more rows
在我的数据集中,我每个月在不同的地方对不同的人进行观察。我想创建一个新列,它是:上个月除当前行的位置之外,此人访问过的所有位置的平均值 value
。因此,例如,第 6 行将是第 2-5 行的平均值(上个月在不是 A
的地方)。
在我的实际数据集中,数据是不平衡的——并且用户在不同的月份被观察——所以任何解决方案都不一定依赖于它。
library(tidyr)
# Generate people, places, and dates
people <- letters[1:3]
places <- LETTERS[1:5]
dates <- seq(as.Date("2020/01/04"), by = "month", length.out = 3)
# Now cross data so there is observation for each person, for each place, for each month
crossed <- crossing(people, dates, places)
# Add random values
crossed$value <- rnorm(nrow(crossed), 2)
这是数据的样子
people dates places value
<chr> <date> <chr> <dbl>
1 a 2020-01-04 A 2.94
2 a 2020-01-04 B 1.74
3 a 2020-01-04 C 2.68
4 a 2020-01-04 D 3.96
5 a 2020-01-04 E 0.821
6 a 2020-02-04 A 1.86
7 a 2020-02-04 B 1.04
8 a 2020-02-04 C 1.51
9 a 2020-02-04 D 3.62
10 a 2020-02-04 E 1.81
如果每个月的日期始终恰好相隔一个月,则此方法有效。如果没有,您将不得不修改 dates == .y - months(1)
,但一般方法是相同的。
library(tidyverse)
set.seed(1)
crossed %>%
group_by(people) %>%
mutate(
new_val = map2_dbl(
places,
dates,
~ mean(value[places != .x & dates == .y - months(1)]))
) %>%
ungroup()
输出:
# A tibble: 45 x 5
people dates places value new_val
<chr> <date> <chr> <dbl> <dbl>
1 a 2020-01-04 A 1.37 NaN
2 a 2020-01-04 B 2.18 NaN
3 a 2020-01-04 C 1.16 NaN
4 a 2020-01-04 D 3.60 NaN
5 a 2020-01-04 E 2.33 NaN
6 a 2020-02-04 A 1.18 2.32
7 a 2020-02-04 B 2.49 2.12
8 a 2020-02-04 C 2.74 2.37
9 a 2020-02-04 D 2.58 1.76
10 a 2020-02-04 E 1.69 2.08
# ... with 35 more rows