Как заставить data.table рассматривать ввод как значения, а не имена столбцов? - PullRequest
0 голосов
/ 04 мая 2018

Как я могу заставить 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 голосов
/ 04 мая 2018

Самый простой подход - это использовать другое имя для переменных, которые вы используете. Например:

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
...