【问题标题】:R: efficiently select specified rows from a data.table according to another data.table?R:根据另一个data.table有效地从一个data.table中选择指定的行?
【发布时间】:2015-02-18 01:27:55
【问题描述】:

我有一个叫dt的data.table,还有一个叫sg,这里我要根据sg选择dt的子集。这意味着在dt 中,选定的行(colA 和colB)不应等于sg 行(colA 和colB)。这是我所做的:

dt <- data.table(colA = c(1, 1, 1, 2, 2, 3, 3), colB = c(10, 10, 10, 20, 20, 30, 30), 
  colC = c("A", "I", "A", "A", "A", "I", "A"))
dt

sg <- data.table(colA = c(1, 3), colB = c(10, 30))
sg

dt2 <- paste(dt[, colA], dt[, colB], sep = "-")
sg2 <- paste(sg[, colA], sg[, colB], sep = "-")
dt[!(dt2 %in% sg2)]
# OR the following one
# dt[!((dt[, colA] %in% sg[, colA]) & (dt[, colB] %in% sg[, colB]))]
> dt
   colA colB colC
1:    1   10    A
2:    1   10    I
3:    1   10    A
4:    2   20    A
5:    2   20    A
6:    3   30    I
7:    3   30    A

> sg
    colA colB
1:    1   10
2:    3   30

> dt[!(dt2 %in% sg2)]
    colA colB colC
1:    2   20    A
2:    2   20    A

但是,当数据集很大时,粘贴操作很慢,你能帮我找出一个有效的方法来替换data.table吗?

谢谢。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以利用主键进行适当的左连接:

    > setkey(dt, colA, colB)
    > setkey(sg, colA, colB)
    > dt[!sg]
       colA colB colC
    1:    2   20    A
    2:    2   20    A
    

    这应该更有效率。

    【讨论】:

    • 感谢@Scott Ritchie。这是完美的。
    猜你喜欢
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多