使用R中的data.table子集列

时间:2017-01-21 03:31:50

标签: r data.table

我尝试通过从data.table中选择一些列来对数据集进行子集化。但是,我的代码不适用于某些变体。

这是一个示例data.table

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="messageInput" action="">
  <input id="m" autocomplete="off" maxlength="100" />
</form>

这是一个有效的子集代码:

library(data.table)
DT <- data.table( ID = 1:50,
            Capacity = sample(100:1000, size = 50, replace = F),
            Code = sample(LETTERS[1:4], 50, replace = T),
            State = rep(c("Alabama","Indiana","Texas","Nevada"), 50))

这是一段不起作用的代码。请注意,这适用于数据框,但不适用于data.table。

DT[,1:2]

我需要第二种格式的东西,因为我根据grep()的输出进行子集化,并且它提供与第二种格式相同的输出。我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:6)

我吸取的教训是使用port=int(radd[1]) IndexError: list index out of range 代替list

c

它可以让你忽略那些讨厌的引用,它也会让你朝着将 DT[ ,list(ID,Capacity)] #--------------------------- ID Capacity 1: 1 483 2: 2 703 3: 3 924 4: 4 267 5: 5 588 --- 196: 46 761 197: 47 584 198: 48 402 199: 49 416 200: 50 130 参数视为具有数据表本身环境的计算表达式的方向前进。

获得&#39;按编号分列的命名列使用j函数和mget函数。 R&#39;姓名&#39;是语言元素,即来自当前环境的搜索路径中的数据对象。数据帧的列名实际上不是R names。因此,您需要一个具有字符值的函数,并使解释器将其视为完全限定的names。数据表 - [ - j项的函数语法确实将列名称作为语言对象处理,而不是像name那样处理字符值 - 函数:

[.data.frame

答案 1 :(得分:4)

这里的主要问题是data.table中的列是引用对象,因此您不能使用与data.frame相同的语法。即没有引用的名称或数字

所以myCompare comp(nums1, nums2); priority_queue<pair<int, int>, vector<pair<int, int>>, myCompare> min_heap(comp); DT[,c("ID", "Capacity")]不起作用的原因而无效。

但是,添加DT[,seq(1:2)]会导致data.table被引用为data.frame将

所以,with=FALSEDT[,c("ID", "Capacity"), with=FALSE]现在可以为您提供所需内容。

DT[,seq(1:2), with=FALSE]
编辑:正如@Rich Scriven所指出的

答案 2 :(得分:3)

在data.table的最新版本中,可以在j中使用数字来指定列。此行为包括DT[,1:2]等格式以指定列的数值范围。 (请注意,此语法不适用于旧版本的data.table)。

那么为什么DT[,1:2]有效,但DT[,seq(1:2)]却没有?答案隐藏在data.table:::[.data.table的代码中,其中包含以下行:

  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
    }

我们在这里可以看到data.table在检测到with = FALSE中使用函数:时会自动为您设置j参数。它没有为seq内置的相同功能,因此如果我们想要使用seq语法,我们必须自己指定= FALSE。

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