r - 如何强制 data.table 将输入视为值,而不是列名?
问题描述
如何让 data.table 理解这些值是上面定义的变量而不是列名?
第一个注释的行应该返回 0L,但返回 dt 中包含的所有数据。
可重现的例子:
library(data.table)
dt <- structure(list(zip_from = c("1000", "1000", "1000", "1000", "1000",
"1000", "1000", "1000", "1000", "1000"), zip_to = c("1000", "1001",
"1002", "1003", "1004", "1005", "1006", "1007", "1008", "1009"
), time_1 = c(0, 332.8, 332.8, 362.5, 504.9, 256.6, 446.4, 694.4,
723.4, 462.3), dist_1 = c(0, 3208, 3208, 3465.3, 4275.5, 2267.6,
4158.1, 5811.4, 8842.6, 4624.7), dist_2 = c(0, 3208, 3208, 3465.3,
4275.5, 2267.6, 4158.1, 5811.4, 8842.6, 4624.7), time_2 = c(0,
332.8, 332.8, 362.5, 504.9, 256.6, 446.4, 694.4, 723.4, 462.3
)), .Names = c("zip_from", "zip_to", "time_1", "dist_1", "dist_2",
"time_2"), sorted = c("zip_from", "zip_to"), class = c("data.table",
"data.frame"), row.names = c(NA, -10L))
zip_from <- "8153"
zip_to <- "9536"
dt[J(zip_from, zip_to), nomatch = 0L] # returns everything (Not OK)
a <- "8153"
b <- "9536"
dt[J(a, b), nomatch = 0L] # returns 0L (OK)
dt[J("8153", "9536"), nomatch = 0L] # returns 0L (OK)
解决方案
最简单的方法是为您使用的变量使用不同的名称。例如:
zip.from <- "8153"
zip.to <- "9536";
dt[J(zip.from, zip.to), nomatch = 0L]
##Empty data.table (0 rows) of 6 cols: zip_from,zip_to,time_1,dist_1,dist_2,time_2
要强制 data.table 包使用 zip_from 和 zip_to 变量中的值而不是具有相同名称的列名,您可以使用注释中建议的代码:
dt[J(get("zip_from", envir=.GlobalEnv), get("zip_to", envir=.GlobalEnv)), nomatch = 0L]
##Empty data.table (0 rows) of 6 cols: zip_from,zip_to,time_1,dist_1,dist_2,time_2
推荐阅读
- laravel - Composer 自动加载器找不到类
- c++ - C++20 中是否允许使用east constexpr / constinit / consteval?
- excel - 从 excel 发布到 azure 时如何在 azure board 中添加所有项目,包括默认 6 项以外的项目
- c++ - 无法在 VS2017 上将 libclang 与 cmake 链接
- javascript - axios.patch 和数据加载问题
- python - 如何使用 rstrip 从由循环生成的字符串中删除尾随空格
- reactjs - 当输入为空白时,应按 Backspace 删除最后一个芯片
- python-3.x - 打印枚举列表的第 n 个索引
- c++ - 如何在 C++ 中将整数从一种方法调用到另一种方法
- apache-spark - 如何在 Kafka 和 spark-sql 中管理流式应用程序中的审计?