我想从另一个减去一个R data.table。我有一个匹配列的列表,还有一个列的列表,可以对减法进行操作。
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]
我想获取以下数据表。
Date Time ColumnA ColumnB Session
1: 01/01/2013 AB -1 3 PREPOST
2: 02/01/2013 JJ -10 0 PREPOST
对于matchCols相同的行,应该从dt1中减去dt2中的mergeingCols值,这样我就可以获得差值。 mergingCol太多,无法在代码中单独指定它们。
以下是类似的问题,但我无法将它们减去:
How to apply same function to every specified column in a data.table
Merge data frames whilst summing common columns in R
combine data.tables and sum the shared column
先行先行聚合还是加入方法会起作用?
答案 0 :(得分:2)
好的,这应该是完全自动化的,命名和所有操作:
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
答案 1 :(得分:1)
另一个建议:
dt1[dt2, on=matchingCols, nomatch=0L][,
.(Date, Code, ColA=ColumnA - i.ColumnA,
ColB=ColumnB - i.ColumnB,
Session=paste0(Session,i.Session))]