【问题标题】:Subtraction to combine two R data.tables by matching rows通过匹配行来组合两个 R data.tables 的减法
【发布时间】:2019-05-13 01:09:31
【问题描述】:

我想从另一个中减去一个 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]

我想得到以下data.table:

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

对于匹配Cols 相同的行,应从 dt1 中减去 dt2 中的 mergingCols 值,以便获得差值。 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

rbind 然后聚合方法或加入方法是否有效?

【问题讨论】:

  • 它的核心类似于dt1[dt2, on=matchingCols, .(ColumnA - i.ColumnA, ColumnB - i.ColumnB), nomatch=0L, by=.EACHI] - 不确定如何自动化最后一点。
  • 可能是paste0(Session, i.Session)?

标签: r merge data.table aggregate


【解决方案1】:

另一个建议:

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

【讨论】:

  • 我喜欢这种方法的简单性,但是合并列太多,无法在代码中单独指定它们(即,无需输入“ColumnA”)。非常感谢 chinsoon12 和 thelatemail!
【解决方案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

【讨论】:

    猜你喜欢
    • 2013-11-22
    • 2016-02-24
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多