我无法想象这已经没有在其他地方解释过,但不幸的是我找不到它。在任何情况下,我认为对许多用户来说更好地理解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")]
但是,一旦我加入了tableX
和tableB
,tableA
也发生了变化,相当于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一段时间,但似乎我还没有充分了解它。