Вычитание для объединения двух R data.tables путем сопоставления строк - PullRequest
0 голосов
/ 12 декабря 2018

Я хотел бы вычесть одну таблицу данных 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]

Я хотел бы получить следующую таблицу data.table:

         Date Time ColumnA ColumnB Session
1: 01/01/2013   AB      -1       3 PREPOST
2: 02/01/2013   JJ     -10       0 PREPOST

Значения mergingCols в dt2 должны быть вычтены из dt1 для строк, в которых matchCols совпадают, чтобы я мог получить значения разностей.Слишком много слияющих коллов, чтобы указывать их по отдельности в коде.

Вот аналогичные вопросы, но я не могу адаптировать их для вычитания:

Как применить одну и ту же функцию к каждому указанномустолбец в data.table

Объединение фреймов данных при суммировании общих столбцов в R

объединение data.tables и суммирование общего столбца

Сработает ли rbind с агрегированным подходом или подход с объединением?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Хорошо, это должно быть полностью автоматизировано, присвоение имен и все:

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
0 голосов
/ 12 декабря 2018

Другое предложение:

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