首页 > 解决方案 > 如何强制 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)

标签: rdata.tablebinary-search

解决方案


最简单的方法是为您使用的变量使用不同的名称。例如:

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

推荐阅读