【问题标题】:R data.table 'by' behavior when using expressionR data.table 'by' 使用表达式时的行为
【发布时间】:2015-03-03 15:45:44
【问题描述】:

我在数据表中使用“by”时偶然发现了一种特殊行为。如果有人可以解释以下行为,那就太好了

我只是将一列值相加成正负两个桶。

dt = data.table(a=sample(letters, 100, replace=T), b= (-49:50), c=(-49:50))

以下所有工作

dt[, sum(b), by=as.logical(b>0)];
dt[, sum(b), by=as.factor(b>0)];
compFun = function(x,y) x>y; dt[, sum(b), by=compFunc(b,0)];
#FALSE -1225
#TRUE  1275

但这不是

dt[, sum(b), by=(b>0)];
#TRUE   1
#FALSE  0

看起来 .SD 在最后一种情况下没有“b”列。 我在这里想念什么?这不是不一致的行为吗?

谢谢

【问题讨论】:

标签: r data.table


【解决方案1】:

看看

dt[, names(.BY), by=(b>0)]
#        b V1
# 1: FALSE  b
# 2:  TRUE  b

dt[, names(.BY), by=I(b>0)]
#        I V1
# 1: FALSE  I
# 2:  TRUE  I

我认为在第一种情况下,它会覆盖变量 b,因此当您调用 dt[, sum(b), by=(b>0)] 时,它会汇总 BY 变量而不是数据表的列 b...

【讨论】:

  • 是的。它曾经是,因为从表达式中提取的列名是b。绕过的方法是命名by-expression。但是在 1.9.5 中,这些情况现在被捕获,并且在这些情况下列名没有被简化。
猜你喜欢
  • 2021-06-12
  • 1970-01-01
  • 2016-05-13
  • 2020-08-11
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多