我尝试通过从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()的输出进行子集化,并且它提供与第二种格式相同的输出。我做错了什么?
谢谢!
答案 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=FALSE
和DT[,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]