X [Y] data.table联接影响源表

时间:2015-12-08 15:55:53

标签: r data.table

我无法想象这已经没有在其他地方解释过,但不幸的是我找不到它。在任何情况下,我认为对许多用户来说更好地理解data.table

是有用的

我有两个data.tables,我希望使用值从第二个表中覆盖第一个表中的值。这是一个可重复的例子:

这是第一张表:

tableA = data.table(A = as.character(c("a", "b", "c", "d")), 
                B = as.character(c("A", "B", "C", "D")), 
                C = as.numeric(1:4), 
                D = as.numeric(5:8), 
                E = rep( "*", 4))

setkey(tableA, A, B)

> tableA
   A B C D E
1: a A 1 5 *
2: b B 2 6 *
3: c C 3 7 *
4: d D 4 8 *

tableB = data.table(A = as.character(c("a", "b", "c")), 
                B = as.character(c("A", "B", "C")), 
                C = as.numeric(1:3), 
                D = as.numeric(c(5,6,10)), 
                E = rep( "*", 3))

setkey(tableB, A, B)

> tableB
   A B C  D E
1: a A 1  5 *
2: b B 2  6 *
3: c C 3 10 *

tableA[tableB, names(tableB) := tableB, on = c("A", "B)]

> tableA
   A B C  D E
1: a A 1  5 *
2: b B 2  6 *
3: c C 3 10 *
4: d D 4  8 *

这正是我想要的。但是,如果我需要保留原始表怎么办?好吧,我认为将它分配给另一个对象然后应用相同的过程会很容易:

tableA = data.table(A = as.character(c("a", "b", "c", "d")), 
                B = as.character(c("A", "B", "C", "D")), 
                C = as.numeric(1:4), 
                D = as.numeric(5:8), 
                E = rep( "*", 4))

setkey(tableA, A, B)

tableB = data.table(A = as.character(c("a", "b", "c")), 
                B = as.character(c("A", "B", "C")), 
                C = as.numeric(1:3), 
                D = as.numeric(c(5,6,10)), 
                E = rep( "*", 3))
setkey(tableB, A, B)

tableX = tableA
tableX[tableB, names(tableB) := tableB, on = c("A", "B")]

但是,一旦我加入了tableXtableBtableA也发生了变化,相当于tableX而没有将其添加到联接中。

> tableA
   A B C  D E
1: a A 1  5 *
2: b B 2  6 *
3: c C 3 10 *
4: d D 4  8 *
> tableX
   A B C  D E
1: a A 1  5 *
2: b B 2  6 *
3: c C 3 10 *
4: d D 4  8 *

有人可以解释为什么会这样吗?我一直在使用data.table一段时间,但似乎我还没有充分了解它。

0 个答案:

没有答案