过滤行时的R data.table行为

Abh*_*bhi 4 r data.table

我在R中创建一个data.table并设置一个用作键的列.当我尝试从数据表中检索值时; 对于没有匹配的行,我得到NA值.我通常不希望在我的搜索中出现这种行为.以下示例

library(data.table) 
dt <- data.table('foo'=seq(10),bar=sample(letters,10))
setkey(dt,bar)
dt[sample(letters,5)]


> dt[sample(letters,5)]
   b foo
1: x   4
2: q   2
3: u   8
4: s  NA
5: b  NA
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 6

要删除NA行,只需设置nomatch=0:

这是一个例子(我删除了随机抽样,所以每个人都可以得到相同的结果)

library(data.table)
dt = data.table(foo = 1:10, bar = letters[1:10])
setkey(dt, bar)
needed_letters = letters[c(1:8,11,12)] #1 - 8 are available, 11 and 12 are not
dt[J(needed_letters),nomatch=0]
Run Code Online (Sandbox Code Playgroud)

来自马特的补充

此外,如果您希望nomatch=0成为默认值,则可以更改默认值:

options(datatable.nomatch=0)
dt[J(needed_letters)]    # now, no NAs will be returned
Run Code Online (Sandbox Code Playgroud)

你可以检查这样的所有参数:

> args(data.table:::`[.data.table`)

function (x, i, j, by, keyby,
    with = TRUE,
    nomatch = getOption("datatable.nomatch"), 
    mult = "all",
    roll = FALSE,
    rollends = if (roll=="nearest") c(TRUE,TRUE)
               else if (roll>=0) c(FALSE, TRUE)
               else c(TRUE,FALSE),
    which = FALSE,
    .SDcols,
    verbose = getOption("datatable.verbose"), 
    allow.cartesian = getOption("datatable.allow.cartesian"), 
    drop = NULL) 
Run Code Online (Sandbox Code Playgroud)

默认为via的参数getOption因此可以更改其默认值.