使用 mutate 添加一个新键,其关系在另一个 table 中。 Tidyverse/Lubridate/R

Use mutate to add a new key whose relation is in another table. Tidyverse/Lubridate/R

我有一个监控一些变量的数据框,每个寄存器都与一个 key1 相关联。但是,我想将此变量与与不同的新 key2 关联的其他变量相关联。为此,我有一个 table 显示两个键之间的关系。

这很简单,我想我只需要创建一个新列,使用 mutate() 将新的 key2 添加到数据帧中,但棘手的部分是 key2 的多个值可以与同一个 key1 相关联.因为 key1 表示客户,而 key2 表示事件。幸运的是,table 显示了 key1 和 key2 的依赖关系,也显示了时间范围。因此,我可以使用寄存器的时间和事件的间隔来区分我必须在数据帧中改变哪个 key2。虽然我不知道该怎么做。

我这里举个更简单的例子,12个register样本关联3个客户(01,02,03),对应4个事件(A,B,C,D)。

library(lubridate)
library(tidyverse)
set.seed(123)
df1 <- data.frame(
  Key1 = c('01','01','01','02','02','02','02','02','02','03','03','03'),
  type = c('R','R','R','C','C','R','C','R','R','C','C','R'),
  value = dnorm(1:12,mean=5,sd=10),
  hour = c(now(),now()+hours(1),now()+hours(2),now()-hours(338),now()-hours(337),
           now()-hours(336), now()-hours(48),now()-hours(47),now()-hours(46),
           now(),now()+hours(20),now()+hours(30))
  )

df2 <- data.frame(
  key2 = c('A','B','C','D'),
  Key1 = c('02','02','01','03'),
  time = c(interval(now()-hours(340),now()-hours(299)),
                    interval(now()-hours(60),now()-hours(46)),
                    interval(now()-hours(10),now()+hours(10)),
                    interval(now()-hours(5),now()+hours(50))))
)

我想知道是否有办法创建一个新列,为 df1 中的每个样本添加寄存器时间所在的事件的 key2。我知道如何使用 for 循环来完成它,但我想学习一种使用 tydyverse 来完成它的方法。谢谢!

你可以这样做:

df1 %>%
  left_join(df2 %>% pivot_wider(values_from = time,
                                names_from = c(key2)),
            by = "Key1") %>%
  pivot_longer(cols = df2$key2,
               values_to = "values_df2",
               names_to = "key2") %>%
  filter(!is.na(values_df2) & hour %within% values_df2)

给出:

# A tibble: 12 x 6
   Key1  type   value hour                key2  values_df2                                        
   <chr> <chr>  <dbl> <dttm>              <chr> <Interval>                                        
 1 01    R     0.0368 2021-10-25 11:34:35 C     2021-10-25 01:34:38 CEST--2021-10-25 21:34:38 CEST
 2 01    R     0.0381 2021-10-25 12:34:35 C     2021-10-25 01:34:38 CEST--2021-10-25 21:34:38 CEST
 3 01    R     0.0391 2021-10-25 13:34:35 C     2021-10-25 01:34:38 CEST--2021-10-25 21:34:38 CEST
 4 02    C     0.0397 2021-10-11 09:34:35 A     2021-10-11 07:34:38 CEST--2021-10-13 00:34:38 CEST
 5 02    C     0.0399 2021-10-11 10:34:35 A     2021-10-11 07:34:38 CEST--2021-10-13 00:34:38 CEST
 6 02    R     0.0397 2021-10-11 11:34:35 A     2021-10-11 07:34:38 CEST--2021-10-13 00:34:38 CEST
 7 02    C     0.0391 2021-10-23 11:34:35 B     2021-10-22 23:34:38 CEST--2021-10-23 13:34:38 CEST
 8 02    R     0.0381 2021-10-23 12:34:35 B     2021-10-22 23:34:38 CEST--2021-10-23 13:34:38 CEST
 9 02    R     0.0368 2021-10-23 13:34:35 B     2021-10-22 23:34:38 CEST--2021-10-23 13:34:38 CEST
10 03    C     0.0352 2021-10-25 11:34:35 D     2021-10-25 06:34:38 CEST--2021-10-27 13:34:38 CEST
11 03    C     0.0333 2021-10-26 07:34:35 D     2021-10-25 06:34:38 CEST--2021-10-27 13:34:38 CEST
12 03    R     0.0312 2021-10-26 17:34:35 D     2021-10-25 06:34:38 CEST--2021-10-27 13:34:38 CEST

显然,如果你只需要添加键,你可以通过 select(-values_df2) 去掉最后一列,然后给出:

# A tibble: 12 x 5
   Key1  type   value hour                key2 
   <chr> <chr>  <dbl> <dttm>              <chr>
 1 01    R     0.0368 2021-10-25 11:34:35 C    
 2 01    R     0.0381 2021-10-25 12:34:35 C    
 3 01    R     0.0391 2021-10-25 13:34:35 C    
 4 02    C     0.0397 2021-10-11 09:34:35 A    
 5 02    C     0.0399 2021-10-11 10:34:35 A    
 6 02    R     0.0397 2021-10-11 11:34:35 A    
 7 02    C     0.0391 2021-10-23 11:34:35 B    
 8 02    R     0.0381 2021-10-23 12:34:35 B    
 9 02    R     0.0368 2021-10-23 13:34:35 B    
10 03    C     0.0352 2021-10-25 11:34:35 D    
11 03    C     0.0333 2021-10-26 07:34:35 D    
12 03    R     0.0312 2021-10-26 17:34:35 D