Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R/dplyr进行左连接,并基于计算进行连接_R_Dplyr_Data.table_Left Join - Fatal编程技术网

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

使用R/dplyr进行左连接,并基于计算进行连接,r,dplyr,data.table,left-join,R,Dplyr,Data.table,Left Join,我尝试使用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

我尝试使用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
left_join(Table_1, Table_2, by=c("ID"="ID", "MODEL_YEAR"=("YEAR"-1))
新列可以追溯到车型年款。例如,VALUE_Tminus1采用2014年的VALUE 1。我希望新表可以追溯到10年前,在没有可用数据的情况下出现NA

到目前为止,我已经尝试将MODEL_YEAR作为一列添加到表1中,然后将表1左连接到表2,如下所示:

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
left_join(Table_1, Table_2, by=c("ID"="ID", "MODEL_YEAR"=("YEAR"-1))
然而这不起作用,因为我不能用这种方法从“年”中减去1。我想我可以通过添加大量新列和进行多个连接来实现这一点,但我不确定是否有更整洁的方法?也许使用data.table—我知道这可以用于连接,但我不熟悉


非常感谢

因为它有标签,下面是一个
数据表
解决方案:

包装 可复制的数据示例
车型年份%
表1[.]
#ID CHAR1 CHAR2 VALUE1\u Tminus1 VALUE1\u Tminus2 VALUE1\u Tminus3 VALUE1\u Tminus4 VALUE1\u Tminus5 STATUS\u Tminus1 STATUS\u Tminus2 STATUS\u Tminus3 STATUS\u Tminus4 STATUS\u Tminus5
#1:01 xyz abc 234 14 455 NA C B T
#2:02 abc xyz 213钠B

要获得更多延迟,只需将数字5更改为您想要的任何值。

因为它有标签,下面是一个
数据。表
解决方案:

包装 可复制的数据示例
车型年份%
表1[.]
#ID CHAR1 CHAR2 VALUE1\u Tminus1 VALUE1\u Tminus2 VALUE1\u Tminus3 VALUE1\u Tminus4 VALUE1\u Tminus5 STATUS\u Tminus1 STATUS\u Tminus2 STATUS\u Tminus3 STATUS\u Tminus4 STATUS\u Tminus5
#1:01 xyz abc 234 14 455 NA C B T
#2:02 abc xyz 213钠B

要获得更多延迟,只需将数字5更改为您想要的任何值。

非常感谢-这太棒了,我以前从未见过CJ功能。我有一个小问题:我忘了提到tab1包含tab2中不存在的ID,这些ID正在使用上面的代码删除。有没有一种方法可以将它们保留在其中,为这些行的新列指定NA?CJ在基R中有一个类似的元素,称为
expand.grid
。如果我正确理解您的问题,我认为您可以将最后一个参数更改为
[tab1]
,或者您在tab2中是否有tab1中不存在的内容,那么
merge()
with
all=TRUE
可能是更改最后一个参数的方法。非常感谢-这很好,我以前从未见过CJ功能。我有一个小问题:我忘了提到tab1包含tab2中不存在的ID,这些ID正在使用上面的代码删除。有没有一种方法可以将它们保留在其中,为这些行的新列指定NA?CJ在基R中有一个类似的元素,称为
expand.grid
。如果我正确理解了您的问题,我认为您可以将最后一个参数更改为
[tab1]
,或者您在tab2中是否有tab1中不存在的内容,那么
merge()
with
all=TRUE
可能是更改最后一个参数的方法。
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>