如何在调用环境中强制data.table将i中的名称解释为向量?

时间:2019-04-09 09:21:28

标签: r data.table

在下面的R代码中,如何获取最后一行以使用向量match而不是dt中称为match的列?

library(data.table)
dt <- data.table(cust_id = 1:4, match = NA)
match <- c(TRUE, FALSE, NA, NA)
dt[is.na(match)]

我知道我可以将向量的名称更改为dt中非列的名称,但是data.table将通过函数传递,我不能保证哪一列将包含的名称。

我还知道我可以将match向量作为列添加到具有不同名称的dt中,但是我不想修改dt

2 个答案:

答案 0 :(得分:0)

您可以使用:

dt[eval(is.na(match))]

答案 1 :(得分:0)

dt <- data.table(cust_id = 1:4, match = NA, 
                 is_na_match = c(TRUE, FALSE, TRUE, FALSE))
match <- c(TRUE, FALSE, NA, NA)

dt[is_na_match]

# Error in `[.data.table`(dt, is_na_match) : 
#   is_na_match is not found in calling scope but it is a column of type logical. 
#   If you wish to select rows where that column is TRUE, either wrap the symbol 
#   with '()' or use ==TRUE to be clearest to readers of your code.

(注意:即使在is_na_match的此修改示例中存在伪列dt,也会出现此错误)。

按照错误消息中的建议进行操作:

dt[(is_na_match)]

#    cust_id match is_na_match
# 1:       1    NA        TRUE
# 2:       3    NA        TRUE

而:

is_na_match <- is.na(match)
dt[is_na_match]

#    cust_id match is_na_match
# 1:       3    NA        TRUE
# 2:       4    NA       FALSE

来自help("data.table")

  

高级:当i是单个变量名称时,不将其视为   列名称的表达式,而是在调用范围内求值。