首页 > 解决方案 > 使用 data.table 避免 mget

问题描述

我想(动态地和就地)将一些列从一个数据表带入另一个数据表。我有以下代码可以提供所需的输出:

# Set up example data
dt <- as.data.table(iris)[, rowid:=.I]
dt1 <- dt[, .(rowid, Sepal.Length, Sepal.Width)]
dt2 <- dt[, .(rowid, Species)]
cols <- c('Sepal.Length', 'Sepal.Width')

# Join the datasets
dt2[dt1, (cols):= mget(cols), on='rowid', verbose=T]

但是,这对我的真实数据来说很慢,并且verbose状态的输出:在 j.ansvars 中找到的“'(m)get' 被设置为所有列。使用 .SDcols 或单个 j=eval(macro) 代替。两者都会检测对效率很重要的色谱柱。”

我尝试了各种形式的.SDcolsand eval,但它们要么给出错误,要么给出不适当的输出(例如,列包含作为字符串的列名)。例如:

dt2[dt1, (cols):= .SD, .SDcols=cols, on='rowid', verbose=T]
dt2[dt1, (cols):= eval(quote("list(Sepal.Length, Sepal.Width)")), on='rowid', verbose=T]
dt2[dt1, (cols):= eval(parse(text="list(Sepal.Length, Sepal.Width)")), on='rowid', verbose=T]

注意。这个问题类似于data.table join 中 i 表达式的 .SD 和 .SDcols,但是在这种情况下接受的答案是使用mget,我正在尝试寻找更有效的替代方法。

标签: rdata.table

解决方案


推荐阅读