减法通过匹配行组合两个R data.Table

减法通过匹配行组合两个R data.Table,r,merge,data.table,aggregate,R,Merge,Data.table,Aggregate,我想从一个R数据表中减去另一个。我有一个匹配列的列表,还有一个要进行减法运算的列的列表 dt1 <- data.table(read.table(header=T, text= "Date Code ColumnA ColumnB Session 01/01/2013 AB 0 5 PRE 01/01/2013 CJ 15 25 PRE 01/0

我想从一个R数据表中减去另一个。我有一个匹配列的列表,还有一个要进行减法运算的列的列表

dt1 <- data.table(read.table(header=T, text=
"Date           Code       ColumnA    ColumnB Session
01/01/2013      AB         0          5       PRE
01/01/2013      CJ         15         25      PRE
01/01/2013      JJ         20         20      PRE
02/01/2013      JJ         25         15      PRE"))

dt2 <- data.table(read.table(header=T, text=
"Date           Code      ColumnA    ColumnB Session
01/01/2013      BB        15         25      POST
01/01/2013      AB        1          2       POST
02/01/2013      AB        25         15      POST
02/01/2013      JJ        35         15      POST"))

matchingCols <- c("Date", "Code")
mergingCols <- names(dt1)[3:4]
对于匹配列相同的行,应该从dt1中减去dt2中的mergingCols值,以便获得差值。有太多的mergingcol,无法在代码中单独指定它们

下面是一些类似的问题,但我无法将它们用于减法:

rbind然后聚合方法或联合方法有效吗?

另一个建议:

dt1[dt2, on=matchingCols, nomatch=0L][,
    .(Date, Code, ColA=ColumnA - i.ColumnA, 
            ColB=ColumnB - i.ColumnB,
            Session=paste0(Session,i.Session))]
另一项建议:

dt1[dt2, on=matchingCols, nomatch=0L][,
    .(Date, Code, ColA=ColumnA - i.ColumnA, 
            ColB=ColumnB - i.ColumnB,
            Session=paste0(Session,i.Session))]

好的,这应该是完全自动化的,命名和所有:

dt1[
  dt2,
  on=matchingCols, 
  lapply(
    setNames(mergingCols, mergingCols),
    function(x) get(x) - get(paste0("i.", x))
  ),
  nomatch=0L,
  by=.EACHI
]

#         Date Code ColumnA ColumnB
#1: 01/01/2013   AB      -1       3
#2: 02/01/2013   JJ     -10       0

好的,这应该是完全自动化的,命名和所有:

dt1[
  dt2,
  on=matchingCols, 
  lapply(
    setNames(mergingCols, mergingCols),
    function(x) get(x) - get(paste0("i.", x))
  ),
  nomatch=0L,
  by=.EACHI
]

#         Date Code ColumnA ColumnB
#1: 01/01/2013   AB      -1       3
#2: 02/01/2013   JJ     -10       0

它的核心类似于dt1[dt2,on=matchingCols,.ColumnA-i.ColumnA,ColumnB-i.ColumnB,nomatch=0L,by=.EACHI]——不知道如何自动化最后一点。可能是粘贴0session,i.Session?它的核心类似于dt1[dt2,on=matchingcolls,.ColumnA-i.ColumnA,ColumnB-i.ColumnB,nomatch=0L,by=.EACHI]-不确定如何自动化最后一点。可能是paste0Session,i.Session?我喜欢这种方法的简单性,但有太多的mergingcol,无法在代码中单独指定它们,即不键入ColumnA。非常感谢chinsoon12和最近的邮件!我喜欢这种方法的简单性,但是有太多的mergingcol,无法在代码中单独指定它们,也就是说,没有键入ColumnA。非常感谢chinsoon12和最近的邮件!