R data.table NA类型一致性

时间:2016-08-01 16:14:37

标签: r data.table na

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类型?

1 个答案:

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