在函数中连接data.tables

时间:2016-10-07 13:21:39

标签: r data.table

我想通过在函数中进行连接来更改data.table。我理解data.tables通过引用工作,因此假设将data.table的连接版本重新分配给自身将改变原始data.table。我误解了什么简单的事情?

谢谢!

library('data.table')

# function to restrict DT to subset, by join
join_test <- function(DT) {
    test_dt     = data.table(a = c('a', 'b'), c = c('x', 'y'))
    setkey(test_dt, 'a')
    setkey(DT, 'a')

    DT  <- DT[test_dt]
}

DT  = data.table(a = c("a","b","c"), b = 1:3)
print(DT)
#    a b
# 1: a 1
# 2: b 2
# 3: c 3
haskey(DT)
# [1] FALSE

join_test(DT)
print(DT)
#    a b
# 1: a 1
# 2: b 2
# 3: c 3
haskey(DT)
# [1] TRUE

(包括haskey调用只是为了仔细检查某些引用更改是否有效)

2 个答案:

答案 0 :(得分:2)

您可以通过引用来实现,(因为您可以根据连接的值通过引用连接和分配列,而无需实际保存连接的表)。但是,您需要明确选择

之后的列
join_test <- function(DT) {
    test_dt     = data.table(a = c('a', 'b'), c = c('x', 'y'))
    DT[test_dt, c := c, on = 'a'] 
}

答案 1 :(得分:1)

让你的函数返回数据表并将结果存储在DT中可以得到你想要的东西。

join_test <- function(DT) {
  test_dt     = data.table(a = c('a', 'b'), c = c('x', 'y'))
  setkey(test_dt, 'a')
  setkey(DT, 'a')

  DT  <- DT[test_dt]

  return(DT)
}

DT  = data.table(a = c("a","b","c"), b = 1:3)

DT <- join_test(DT)
print(DT)
#    a b c
# 1: a 1 x
# 2: b 2 y