使用R / dplyr进行左连接,基于计算进行连接

问题描述 投票:0回答:1

我试图使用dplyr在R中连接两个表,这样:

表格1:

ID    CHAR1    CHAR2
01      xyz      abc
02      abc      xyz

等等...

表2:

ID    YEAR    VALUE1    STATUS
01    2012      455          T
01    2013       14          B
01    2014      234          C
01    2015       17          T
02    2014      213          B
02    2015      456          B
02    2016       17          B

我有一个名为MODEL_YEAR的单独变量,在此示例中设置为2015。

我希望我的新表看起来像这样:

ID  CHAR1  CHAR2  VALUE_Tminus1 VALUE_Tminus2 STATUS_Tminus1 STATUS_Tminus2
01    xyz    abc            234            14              C              B
02    abc    xyz            213            NA              B             NA

新列从MODEL_YEAR返回。例如,VALUE_Tminus1从2014年开始采用VALUE1。我希望新表可以追溯到10年,NA会在没有数据的情况下发生。

到目前为止,我尝试这样做,我将MODEL_YEAR添加为表1中的列,然后执行左连接表1到表2,如下所示:

left_join(Table_1, Table_2, by=c("ID"="ID", "MODEL_YEAR"=("YEAR"-1))

然而这不起作用,因为我不能以这种方式从“年”中减去1。我想我可以通过添加大量新列并进行多个连接来实现这一点,但我不确定并且想知道是否有更简洁的方法?也许使用data.table - 我知道这可以用于连接,但我不熟悉它。

非常感谢

r dplyr data.table left-join
1个回答
2
投票

由于它有标签,这里是data.table解决方案:

Packages

library(data.table)
library(magrittr) # For readability only

Reproducible example of your data

MODEL_YEAR <- 2015L
tab1 <- fread(
  'ID    CHAR1    CHAR2
  01      xyz      abc
  02      abc      xyz',
  colClasses = 'character'
)
tab2 <- fread(
  'ID    YEAR    VALUE1    STATUS
  01    2012      455          T
  01    2013       14          B
  01    2014      234          C
  01    2015       17          T
  02    2014      213          B
  02    2015      456          B
  02    2016       17          B',
  colClasses = c('character', 'integer', 'integer', 'character')
)

Solution:

setkey(tab1, ID)
setkey(tab2, ID, YEAR)
tab2[CJ(ID, YEAR = seq(MODEL_YEAR - 1, MODEL_YEAR - 5), unique = TRUE)] %>% 
  .[, YEAR := paste0('Tminus', MODEL_YEAR - YEAR)] %>%
  dcast(ID ~ YEAR, value.var = c('VALUE1', 'STATUS')) %>% 
  tab1[.]

#    ID CHAR1 CHAR2 VALUE1_Tminus1 VALUE1_Tminus2 VALUE1_Tminus3 VALUE1_Tminus4 VALUE1_Tminus5 STATUS_Tminus1 STATUS_Tminus2 STATUS_Tminus3 STATUS_Tminus4 STATUS_Tminus5
# 1: 01   xyz   abc            234             14            455             NA             NA              C              B              T           <NA>           <NA>
# 2: 02   abc   xyz            213             NA             NA             NA             NA              B           <NA>           <NA>           <NA>           <NA>

要获得更多滞后,只需将数字5更改为您想要的任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.