数据表自索引时出现错误

3

这里有一个例子可以更加清晰地说明我的意思:

require(data.table)
x = data.table(a=1:10, idx=sample(c(TRUE, FALSE), 10, replace=TRUE))
x[idx]
Error in eval(expr, envir, enclos) : object 'idx' not found

然而,以下方法可以解决该问题:
x[idx[]]
#a  idx
#1:  2 TRUE
#2:  5 TRUE
#3:  7 TRUE
#4:  9 TRUE
#5: 10 TRUE

这里发生了什么事情,你有什么想法吗?


有趣的是:x[idx == TRUE] 也可以工作。x[(idx)] 也可以。 - David Robinson
3
好的,以下是翻译的结果:原文链接:http://thread.gmane.org/gmane.comp.lang.r.datatable/1588/focus=1589题目:data.table使用“by =”和“keyby =”时的区别我正在学习R语言中的data.table包,但不理解“by=”和“keyby=”区别。是否可以给出一些例子,以帮助我更好地理解它们之间的差异?谢谢!回答:在data.table中,“by =”和“keyby =”用于按指定列进行分组。二者的主要区别在于“keyby =”还会把指定列设为数据表的键。
  • 使用“by =”进行分组示例:
DT[, .(mean(x)), by = y]该代码将数据表DT按y列分组,并计算每个组中x列的平均值。
  • 使用“keyby =”进行分组示例:
setkey(DT, y) DT[, mean(x), by = y]该代码首先将y列设置为数据表DT的键,然后按此键分组并计算每个组中x列的平均值。因此,“keyby =”不仅可用于分组,还可以方便地进行基于键的操作,例如合并、更新等。希望这可以帮助您更好地理解“by =”和“keyby =”之间的区别。
- GSee
1
@DavidRobinson,这是因为在 x[(idx)] 中,(idx) 被视为表达式(在 data.table 环境中),因此获取了 idx 的值。而 x[idx] 则在它自己的(和父级)环境中寻找 idx 变量并返回空值。我觉得有点棘手。 - Arun
1
基本上,除了涉及到 idxx[idx] 表达式之外的任何表达式都将在 data.table 的范围内评估 idx - Ricardo Saporta
@Alex,您应该自己粘贴链接内容并将其接受为答案,以便问题保持已回答/已关闭的状态。 - Arun
显示剩余5条评论
1个回答

2

引用@GSee在评论中提供的链接内容。

你好, 是的,这是预期的。来自于?data.table: "高级:当i是一个单一的变量名时,它不被认为是列名的表达式,而是在调用范围内评估。" 仅通过逻辑列进行子集处理是我能想到的唯一会混淆的例子。但我们经常利用这个特性,例如: TMP = list(...); DT[TMP] 确定DT[TMP]不会因为DT未来有一个名为TMP的列而开始失败。 当我有一个逻辑列boolCol时,我用()包装:DT[(boolCol)]。
这避免了==TRUE的记忆分配和扫描,并避免了DT[DT$boolCol]的变量名重复。 Matthew


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接