我想通过在函数中进行连接来更改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调用只是为了仔细检查某些引用更改是否有效)
答案 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