Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:根据另一个data.table有效地从data.table中选择指定的行吗?_R_Data.table - Fatal编程技术网

R:根据另一个data.table有效地从data.table中选择指定的行吗?

R:根据另一个data.table有效地从data.table中选择指定的行吗?,r,data.table,R,Data.table,我有一个名为dt的data.table和另一个名为sg的data.table,在这里,我想根据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 s

我有一个名为dt的data.table和另一个名为sg的data.table,在这里,我想根据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

dt您可以使用主键执行适当的左连接:

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

这应该更有效率。

谢谢@Scott Ritchie。那太完美了。