【问题标题】:variable usage in data.table [duplicate]data.table 中的变量用法[重复]
【发布时间】:2015-12-03 23:05:51
【问题描述】:

这一定是非常基本的事情,但我不知道如何使用与 data.table 列同名的真实变量。我可以使用不同的变量名来避免冲突,但我想知道是否有办法在放弃 DT 之前评估变量。

> DT = data.table(ID = c("b","b","b","a","a","c"), a = 1:6, b = 7:12, c=13:18)
> DT
   ID a  b  c
1:  b 1  7 13
2:  b 2  8 14
3:  b 3  9 15
4:  a 4 10 16
5:  a 5 11 17
6:  c 6 12 18
> DT[b == 7]
   ID a b  c
1:  b 1 7 13
> b <- 7
> DT[b == b]
   ID a  b  c
1:  b 1  7 13
2:  b 2  8 14
3:  b 3  9 15
4:  a 4 10 16
5:  a 5 11 17
6:  c 6 12 18

【问题讨论】:

  • 嗯,有merge(DT,list(b=b))[]。由于(我认为是)一个错误,需要尾括号。
  • @Frank - 不是必须是merge(DT, list(b=b), by="b")吗?你的代码给了我一个键匹配错误。
  • @RichardScriven 你是对的——哎呀。我在四处寻找让它工作的方法时设置了密钥。
  • 谢谢大家。看起来我最好创建一个新变量而不是跳过箍:-)

标签: r data.table


【解决方案1】:

由于您有两个名为b 的变量,一个在DT 范围内,一个在DT 范围之外,我们必须从全局环境中获取b &lt;- 7。我们可以通过get() 做到这一点。

DT[b == get("b", globalenv())]
#    ID a b  c
# 1:  b 1 7 13

更新:您在 cmets 中提到变量位于函数环境中。在这种情况下,您可以使用parent.frame() 而不是globalenv()

f <- function(b, dt) dt[b == get("b", parent.frame(3))] 

f(7, DT)
#    ID a b  c
# 1:  b 1 7 13
f(12, DT)
#    ID a  b  c
# 1:  c 6 12 18

【讨论】:

  • 在我的情况下,b 是函数内部的一个参数,所以 globalenv() 不能正常工作...
  • f
  • @user1576462 - 我进行了更新以解决 parent.frame() 问题。
猜你喜欢
  • 1970-01-01
  • 2012-09-18
  • 2016-08-03
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 2018-10-21
相关资源
最近更新 更多