给定一个数据框,我试图使用dcast.data.table
中的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
&amp; 10000000007784
只会在这两个方面总结一切。
使用reshape2::dcast
函数时不会发生此错误,此方法会生成正确的结果。
是否有dcast.data.table
产生此错误的原因?
答案 0 :(得分:2)
问题在github上提出并由@jangorecki回复,这个答案来自setNumericRounding
帮助文档。
当加入或分组时,data.table将这些数据舍入到apx 11 s.f.对于许多情况来说,这是很多数字。这是通过将有效数字的最后2个字节四舍五入来实现的。
就像我的14位数字大数字,其中四舍五入,因此合并。
正如@jangorecki所提到的,可以通过设置setNumericRounding(0)
来避免这种情况。但是,我个人已经将我的大数字重新分类为因素。这对我的特定用例更有意义。
除此之外,@ jangorecki还建议在处理大型数字时使用bit64
包。
github上的原始帖子。