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,但我认为也许存在一种更简单的方法来做到这一点。
如果您不确定如何为某些类编写长度为零的向量,您可以第一次遵循常见问题解答 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])将显示重新创建任何向量的零长度版本的代码。
| 归档时间: |
|
| 查看次数: |
1262 次 |
| 最近记录: |