【问题标题】:R data.table NA type consistencyR data.table NA类型一致性
【发布时间】:2016-12-06 19:25:50
【问题描述】:
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 有一个类型并且它不是整数。有没有办法告诉数据表忽略它并尝试将所有 NA 设置为保持一致性的任何类型?

我可以在这里手动设置NA_integer,但是如果我有很多不同类型的列,很难设置所有的NA类型正确。

顺便说一句,我应该为 Date/IDate/ITime 使用哪种 NA 类型?

【问题讨论】:

  • @RichardScriven 我确定第二个有效。你在使用 RStudio 吗?成功执行新命令时,RStuidio 有时会一直提示先前的错误消息。
  • @RichardScriven 哦,我明白了。不要按顺序执行这两个。失败的命令实际上改变了表
  • 你的“x”列不是一个“整数”——我猜是因为.N需要“整数”,所以,使用.N作为返回值,你可以硬编码@ 987654326@ 用于不同的typeofs。在其他情况下,将返回值的storage.mode(此处为NA)设置为适当的类型。

标签: r data.table na


【解决方案1】:

OP 的第一个问题:有没有办法告诉数据表忽略它并尝试将所有 NA 设置为保持一致性的任何类型?

没有。如果没有赋值,您会看到类似的错误:

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 的第二个问题:顺便说一句,我应该为 Date/IDate/ITime 使用哪种 NA 类型?

对于 IDate 等人,我总是按 NA_integer_ 进行子集化,这似乎给出了一个长度为 1 的 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

【讨论】:

  • 子集方式不适用于 ITime -- 适用于 IDate
  • @jf328 我在一个示例中进行了编辑,展示了我如何使用它以及我认为它“有效”的意义。你可以再详细一点吗?对我来说,保留 class 属性就足够了。
  • as.ITime("00:00:01")[NA_integer_] 出现错误——我猜是 data.table 问题?
  • @jf328 是的,这可能是早期版本中的错误。如果这对您来说是一个严重的问题并且您愿意使用不稳定/开发版本,安装说明在这里:github.com/Rdatatable/data.table/wiki/Installation 使用该版本,它对我来说很好。
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多