上个月的计算——有条件

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