【问题标题】:data.table filter doesn't work in with()?data.table 过滤器不适用于 with()?
【发布时间】:2020-12-21 07:55:44
【问题描述】:

我正在根据另一个 data.table 过滤一个 data.table,它给出了一个非常奇怪的结果。 请指教,

library(data.table)
library(magrittr)

set.seed(100)
xA = data.table(A = letters[1:4], B = sample(1:1000))
xB = data.table(A = letters[1:4], B = sample(1:100))


with(xA[30], {
  sprintf(" xA A = %s B = %s", A, B) %>% print
  xB[A == A]$A %>% print
  print("")
  xB[A == "b"]$A %>% print
})

#[1] " xA A = b B = 322"
#  [1] "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" #"d" "a" "b" "c" "d" "a" "b" "c" "d" "a" "b"
# [35] "c" "d" "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" "d" "a" #"b" "c" "d" "a" "b" "c" "d" "a" "b" "c" "d"
# [69] "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" "d" "a" "b" "c" #"d" "a" "b" "c" "d" "a" "b" "c" "d"

#[1] " xA A = b B = 322"
# [1] "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" #"b" "b" "b" "b" "b" "b" "b"

使用玩具代码,它将给出所有b 的结果作为第二个结果,但它给出了所有内容作为第一个打印输出。怎么会?感谢您的建议。

【问题讨论】:

  • 如果在 with 之外执行 xB[A == A]$A,得到的输出是相同的。由于data.table 不需要$ 来引用列名,因此它不知道您所指的A 应该来自xAxB

标签: r data.table


【解决方案1】:

问题是当你只看语句时

xB[A == A]

你怎么知道哪个是列名,哪个是变量名?在这种情况下,data.table 只是假设您想要 A 列等于自身的所有行(这是所有行。尝试使用不同的变量名

with(xA[30], {
  sprintf(" xA A = %s B = %s", A, B) %>% print
  a <- A
  xB[A == a]$A
})

【讨论】:

  • 没错!我应该为条件分配一个变量。
猜你喜欢
  • 2014-03-11
  • 2021-07-07
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2014-03-29
  • 1970-01-01
相关资源
最近更新 更多