考虑代码段:
library(data.table)
foo <- data.table(a = rep(c(1, 0), 5), b = c(rep('bar', 5), rep('baz', 5)))
那么这是正确的:
> foo[, sum(b == 'bar')]
[1] 5
但这不是:
> foo[, sum(b[a] == 'bar')]
[1] 5
可以通过以下方式纠正:
> foo[, sum(b[a == 1] == 'bar')]
[1] 3
在这种情况下,1/0是否不被评估为TRUE / FALSE?
答案 0 :(得分:0)
在这种情况下,打印出中间结果可以对正在发生的事情大有帮助。
a = rep(c(1, 0), 5)
b = c(rep('bar', 5), rep('baz', 5))
a
#> [1] 1 0 1 0 1 0 1 0 1 0
b
#> [1] "bar" "bar" "bar" "bar" "bar" "baz" "baz" "baz" "baz" "baz"
b[a]
#> [1] "bar" "bar" "bar" "bar" "bar"
b[as.logical(a)]
#> [1] "bar" "bar" "bar" "baz" "baz"
由reprex package(v0.3.0)于2019-10-28创建
通过使用b[a]
,您告诉R
的是,对于a
的每个元素,您都希望b
的元素与{ {1}}。而且由于a
仅由零和一组成,所以最终得到的第一个索引只有5次。