r - 使用 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) 代替。两者都会检测对效率很重要的色谱柱。”
我尝试了各种形式的.SDcols
and 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
,我正在尝试寻找更有效的替代方法。
解决方案
推荐阅读
- java - 受保护和包私有(无修饰符)构造函数之间的区别?
- php - 如何将上传的 php 文件显示为纯文本而不是在 wordpress 中执行?
- python-3.x - Python Flask 中的 unittest:打印消息被截断
- apache-spark-sql - 无法使用 sparkR 提交读取 Hive 表
- java - 在 maven 中创建和安装 de-lomboked 源 jar
- java - 从项目父 pom 构建时激活位于不同 pom 中的配置文件
- angular - Angular 6:在子路由中跳过父路由解析器?
- javascript - Angular 不会返回内部嵌套的 for 循环
- python - 循环函数查找数字的平方根
- openstack - Openstack Neutron:通过rest api为路由器添加静态路由器