Select a sequence of columns: `:` works but not `seq`

前端 未结 3 427
旧巷少年郎
旧巷少年郎 2020-12-11 17:00

I\'m trying to subset a dataset by selecting some columns from a data.table. However, my code does not work with some variations.

Here is a sample data.table

3条回答
  •  悲哀的现实
    2020-12-11 17:22

    On recent versions of data.table, numbers can be used in j to specify columns. This behaviour includes formats such as DT[,1:2] to specify a numeric range of columns. (Note that this syntax does not work on older versions of data.table).

    So why does DT[ , 1:2] work, but DT[ , seq(1:2)] does not? The answer is buried in the code for data.table:::[.data.table, which includes the lines:

      if (!missing(j)) {
        jsub = replace_dot_alias(substitute(j))
        root = if (is.call(jsub)) 
          as.character(jsub[[1L]])[1L]
        else ""
        if (root == ":" || (root %chin% c("-", "!") && is.call(jsub[[2L]]) && 
            jsub[[2L]][[1L]] == "(" && is.call(jsub[[2L]][[2L]]) && 
            jsub[[2L]][[2L]][[1L]] == ":") || (!length(all.vars(jsub)) && 
                root %chin% c("", "c", "paste", "paste0", "-", "!") && 
                missing(by))) {
          with = FALSE
        }
    

    We can see here that data.table is automatically setting the with = FALSE parameter for you when it detects the use of function : in j. It doesn't have the same functionality built in for seq, so we have to specify with = FALSE ourselves if we want to use the seq syntax.

    DT[ , seq(1:2), with = FALSE]
    

提交回复
热议问题