data.table评估1/0不等于TRUE / FALSE

时间:2019-10-28 09:34:53

标签: r data.table

考虑代码段:

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?

1 个答案:

答案 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次。

相关问题