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