dt = data.table(x = c(1,1,2,2,2,2,3,3,3,3))
dt[, y := if(.N > 2) .N else NA, by = x] # fail
dt[, y := if(.N > 2) .N else NA_integer_, by = x] # good
第一个分组失败,因为NA
有一个类型而且它不是整数。有没有办法告诉数据表忽略它并尝试将所有NAs保持为保持一致性的任何类型?
我可以在这里手动设置NA_integer
,但如果我有很多不同类型的列,则很难将所有NA类型设置为正确。
BTW,我应该在Date / IDate / ITime中使用哪种NA类型?
答案 0 :(得分:3)
OP的第一个问题:有没有办法告诉数据表忽略它并尝试将所有NAs设置为保持一致性的任何类型?
没有。如果没有分配,您会看到类似的错误:
dt[, if(.N > 2) .N else NA, by = x]
# Error in `[.data.table`(dt, , if (.N > 2) .N else NA, by = x) :
# Column 1 of result for group 2 is type 'integer' but expecting type 'logical'. Column types must be consistent for each group.
在我看来,这个"列类型必须对每个组都是一致的。"还应该为您的案例显示消息。
OP的第二个问题: BTW,我应该将哪种NA类型用于Date / IDate / ITime?
对于IDate等人,我总是按NA_integer_
进行子集,这似乎给出了长度为一的NA切片,例如as.IDate(Sys.Date())[NA_integer_]
。我不知道应该做什么,但我不知道更好的主意。举例说明:
z = IDateTime(factor(Sys.time()))
# idate itime
# 1: 2016-08-01 16:05:25
str( lapply(z, function(x) x[NA_integer_]) )
# List of 2
# $ idate: IDate[1:1], format: NA
# $ itime:Class 'ITime' int NA