在下面的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
。
答案 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
是单个变量名称时,不将其视为 列名称的表达式,而是在调用范围内求值。