直接用正确的数据类型定义空data.table

han*_*101 3 r dplyr data.table

为了使我的函数更加安全,我需要创建一个空的data.table,它具有特定数量的列和预定义的 data.type。这是为了允许稍后调用,dplyr::union即使 data.table 为空。

因此,我想创建一个空的data.table并直接定义列的数据类型。这适用于数字或字符列,但不适用于日期列。

我通过使用 data.table FAQ 中的条目 2.4 找到了一个可能的解决方案,但首先用错误的值填充 data.table 然后再删除它们似乎有点奇怪。常见问题2.4

复制问题的代码:

library(data.table)
library(dplyr)


dt.empty <- data.table("Date" = character()
           , "Char.Vector" = character()
           , "Key.Variable" = character()
           , "ExchangeRate" = numeric()
)


dt.Union <- data.table( "Date" = as.Date(c("2000-01-01", "2001-01-01"))
                        , "Char.Vector" = as.character(c("a", "b"))
                        , "Key.Variable" = as.character(c("x1", "x2"))
                        , "ExchangeRate" = as.numeric(c(2,1.4))



)

dplyr::union(dt.Union
      , dt.empty)
Error: not compatible: 
- Incompatible type for column `Date`: x Date, y character
- Incompatible type for column `ExchangeRate`: x numeric, y character
Run Code Online (Sandbox Code Playgroud)

我可以通过使用dt.Union[0]to create来解决这个问题dt.empty,但我认为也许存在一种更简单的方法来做到这一点。

Fra*_*k 2 5

如果您不确定如何为某些类编写长度为零的向量,您可以第一次遵循常见问题解答 2.4 的建议:

> dput(dt.Union[0])
structure(list(Date = structure(numeric(0), class = "Date"), 
    Char.Vector = character(0), Key.Variable = character(0), 
    ExchangeRate = numeric(0)), row.names = c(NA, 0L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x7ffd8d0ebee0>)
Run Code Online (Sandbox Code Playgroud)

你可以把这个list(...)部分拿出来,你的代码就变成了

myDT = setDT(list(
  Date = structure(numeric(0), class = "Date"), 
  Char.Vector = character(0),
  Key.Variable = character(0), 
  ExchangeRate = numeric(0)
))
Run Code Online (Sandbox Code Playgroud)

更一般地说,dput(x[0L])将显示重新创建任何向量的零长度版本的代码。