1

我需要将一列添加到巨大的 data.table dt.1(来自查找表 dt.2)。可以这样做:

df.1 <- cbind(c(1,2,3,1,2,3,1,2,3),c(1,2,3,1,2,3,1,2,3),c(1,2,3,4,5,6,7,8,9))
colnames(df.1) <- c("ColA", "ColB", "ColC")
df.2 <- cbind(c(1,3),c(1,3),c(10,11))
colnames(df.2) <- c("ColA", "ColB", "ColD")
dt.1 <- data.table(df.1)
dt.2 <- data.table(df.2)

getAnotherColumn <- function() {
  keycols <- c("ColA", "ColB")
  setkeyv(dt.1, keycols)
  setkeyv(dt.2, keycols)
  dt.1 <- merge(dt.1, dt.2, all=TRUE)
  dt.1  # Will print with ColA, ColB, ColC, and ColD. As needed.
}

getAnotherColumn()
dt.1  # Only ColA, ColB, and ColC are here. ColD is also needed.

问题是我必须在函数内部进行,所以在函数返回时,旧的 dt.1 仍然存在(没有新列 ColD)。

如何将列添加到 dt.1 而不是创建新的 dt.1?

由于 dt.1 很大,我不能制作它的“额外副本”。

4

1 回答 1

3

请注意,在函数内部,您dt.1在这一行中更改了对象:

   dt.1 <- merge(dt.1, dt.2, all=TRUE)

您正在为 object 分配一个全新的值dt.1。碰巧新值与 的先前值相关dt.1,但这与例如

   dt.1 <- "spaghetti"  # or any other unrelated value

要通过引用分配,您需要使用:=

getAnotherColumn <- function() {
  keycols <- c("ColA", "ColB")
  setkeyv(dt.1, keycols)
  setkeyv(dt.2, keycols)

  dt.1[dt.2, ColD := ColD]
}

getAnotherColumn()

现在ColDdt.1

> dt.1 
   ColA ColB ColC ColD
1:    1    1    1   10
2:    1    1    4   10
3:    1    1    7   10
4:    2    2    2   NA
5:    2    2    5   NA
6:    2    2    8   NA
7:    3    3    3   11
8:    3    3    6   11
9:    3    3    9   11
于 2013-10-08T00:57:28.920 回答