如何强制data.table将输入视为值,而不是列名?

时间:2018-05-04 10:10:00

标签: r data.table binary-search

如何让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)

1 个答案:

答案 0 :(得分:4)

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

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