【问题标题】:Subset in i by variable name in data.table [duplicate]通过 data.table 中的变量名在 i 中设置子集 [重复]
【发布时间】:2016-12-16 22:37:52
【问题描述】:

假设我有一个 data.table,其中列名在变量中指定。例如,我可能使用dcast 作为:

groups <- sample(LETTERS, 2) # i.e. I don't now the values
dt1 <- data.table(ID = rep(1:2, each = 2), group = groups, value = 3:6)
(dt2 <- dcast(dt1, ID~group, value.var = "value"))
#    ID D Q
# 1:  1 3 4
# 2:  2 5 6

现在我想根据最后两列中的值进行子集化,例如做类似的事情:

dt2[groups[1] == 3 & groups[2] == 4]
# Empty data.table (0 rows) of 3 cols: ID,D,Q

有没有简单的方法? 我发现我可以用钥匙做到这一点:

setkeyv(dt2, groups)
dt2[.(3, 4)]
#    ID D Q
# 1:  1 3 4

但是我该怎么做更精细的事情,就像

dt2[groups[1] > 3 & groups[2] < 7]

?

【问题讨论】:

  • 在随机示例之前最好使用set.seed。正如您在答案中看到的那样,他们无法重新创建您的示例......(改为使用 A、J 列)。
  • @Frank 总的来说我同意,但在这种情况下并不重要。一个随机的例子用来强调我事先不知道变量名。
  • @akrun 从某种意义上说它不是骗子。我们现在(从 1.9.7 开始)有非 equi 连接,这就是 OP 可以在这里使用的条件来过滤条件,如groups[1] &gt; 3 &amp; groups[2] &lt; 7,语法如dt2[.(3,7), on=.(D &gt; V1, Q &lt; 7)],利用二进制搜索。但是,我认为,即使使用链接中包含的方法,也无法动态地将名称 D 和 Q 传递给 on=
  • @akrun 当然,我对“正确”使用选票没有什么要说的。如果您被联合起来或以其他方式成为目标,请将其带到模组中。
  • @akrun 好吧,模组被授权将问题上报给 SO 员工注意,我猜他们可以看到这样的事情。无论如何,我们没有理由在 Max 的问题下讨论这个问题。

标签: r data.table


【解决方案1】:

您可以使用get 到(来自?get

按名称搜索对象

dt2[get(groups[1]) > 2 & get(groups[2]) == 4]
#   ID A J
#1:  1 3 4

【讨论】:

  • 是的,这是有道理的,谢谢!
  • @Max 感谢更新删除了我的帖子
【解决方案2】:

我们可以将evalas.name 一起使用,它应该比get 更快

dt2[eval(as.name(groups[1])) > 2 & eval(as.name(groups[2])) == 4]
#   ID L U
#1:  1 4 3

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2020-08-31
    相关资源
    最近更新 更多