【问题标题】:R data.table behavior while filtering rows过滤行时的 R data.table 行为
【发布时间】:2023-04-05 09:16:02
【问题描述】:

我正在 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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    要删除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]
    

    来自马特的补充

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

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

    您可以像这样检查所有参数:

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

    默认通过getOption 的参数因此可以更改其默认值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2018-11-21
      • 2022-12-08
      • 2023-02-08
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多