0

给定一个数据框,我尝试使用dcast.data.tablefrom 函数从长到宽转换library(data.table)。但是,当在公式的左侧使用大数字时,它有些组合方式。

下面是一个例子:

df <- structure(list(A = c(10000000007624, 10000000007619, 10000000007745, 
10000000007624, 10000000007767, 10000000007729, 10000000007705, 
10000000007711, 10000000007784, 10000000007745, 10000000007624, 
10000000007762, 10000000007762, 10000000007631, 10000000007762, 
10000000007619, 10000000007628, 10000000007705, 10000000007762, 
10000000007624, 10000000007745, 10000000007706, 10000000007767, 
10000000007777, 10000000007624, 10000000007745, 10000000007624, 
10000000007777, 10000000007771, 10000000007631, 10000000007624, 
10000000007640, 10000000007642, 10000000007708, 10000000007711, 
10000000007745, 10000000007767, 10000000007655, 10000000007722, 
10000000007745, 10000000007762, 10000000007771, 10000000007617
), B = c(4060697L, 7683673L, 7699192L, 1322422L, 7754939L, 7448486L, 
2188027L, 1061376L, 2095950L, 7793530L, 2095950L, 6447861L, 2188027L, 
7448451L, 7428427L, 7516354L, 7067801L, 2095950L, 6740142L, 405911L, 
4057215L, 1061345L, 7754945L, 7501748L, 2188027L, 7780980L, 6651988L, 
6649330L, 6655118L, 6556367L, 6463510L, 2347462L, 7675114L, 6556361L, 
1061345L, 7224099L, 6463515L, 2188027L, 6463515L, 7311234L, 7764971L, 
7224099L, 2347479L), C = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 
3L, 3L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 25L, 2L, 1L, 2L, 
1L, 1L, 1L)), .Names = c("A", "B", "C"), row.names = c(NA, -43L
), class = "data.frame")

df <- as.data.table(df)

output <- dcast.data.table(df, A ~ B, value.var = "C",
                           fun.aggregate = sum, fill = NA)

这将只产生 2 行,10000000007624&10000000007784并且所有内容都将总结在这两个中。

使用函数时不会出现此错误reshape2::dcast,此方法产生正确的结果。

是否有dcast.data.table产生此错误的原因?

4

1 回答 1

2

问题在 github 上提出并由 @jangorecki 回复,此答案来自setNumericRounding帮助文档。

加入或分组时,data.table 将此类数据四舍五入到 apx 11 sf,这在许多情况下是很多数字。这是通过将有效数字的最后 2 个字节四舍五入来实现的。

因此,我的 14 位大数字被四舍五入并因此组合在一起。

正如@jangorecki 提到的,这可以通过设置来避免setNumericRounding(0)。但是,我个人已将我的大数字重新分类为因子。这对我的特定用例更有意义。

除此之外,@jangorecki 还建议bit64在处理大数字时使用包。

github上的原始帖子。

于 2016-06-21T13:57:20.780 回答