.N 在 `by` 中使用变量时与 length(variable) 不同

Num*_*ari 5 r data.table

绕过data.table小插曲“data.table 简介”,第 2 节“聚合”中的示例就是这样

ans <- flights[, .(.N), by = .(origin)]
ans
#    origin     N
#    <char> <int>
# 1:    JFK 81483
# 2:    LGA 84433
# 3:    EWR 87400
Run Code Online (Sandbox Code Playgroud)

Relacing.Nlength的如“年”给出了相同数量的每个组的列:

> flights[, .(length(year)), by = .(origin)]
   origin    V1
1:    JFK 81483
2:    LGA 84433
3:    EWR 87400
Run Code Online (Sandbox Code Playgroud)

或者

> flights[, .(length(carrier)), by = .(origin)]
   origin    V1
1:    JFK 81483
2:    LGA 84433
3:    EWR 87400
Run Code Online (Sandbox Code Playgroud)

这是预料之中的。但是,当我使用length(origin),即在 中用作分组变量的相同变量时by,会执行不同的计算:结果为 1:

> flights[, .(length(origin)), by = .(origin)]
   origin V1
1:    JFK  1
2:    LGA  1
3:    EWR  1
Run Code Online (Sandbox Code Playgroud)

有没有解释为什么会发生这种情况?

对于更复杂的示例,它可能会被忽略,因此始终使用内置函数似乎.N比尝试使用length函数计算计数更安全。

jan*_*cki 5

这是由于在by( 或keyby) 参数中使用的变量或您正在对结果进行分组的变量在j参数中访问它们时已经分组为标量(特定组)。

有两个相关的开放问题可能对读者有用