2016-06-21 4 views
0

Учитывая фрейм данных, я пытаюсь использовать из long-to-wide, используя функцию dcast.data.table от library(data.table). Однако при использовании больших чисел в левой части формулы некоторые из них сочетаются.Ошибка с большими числами в dcast.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 вызывает ошибку?

+0

Проверьте, не происходит ли это также с версией разработки. Если файл содержит отчет об ошибке. В качестве обходного пути вы можете принуждать 'A' к характеру. – Roland

+0

@ Роланд проблема возникает и на версии разработки, и поднял билет. Я обнаружил, что 'data.table :: dcast()' работает как ожидалось. – amwill04

+1

Я предоставил отзыв в вашей проблеме о github, пожалуйста, не стесняйтесь отвечать на вопрос. – jangorecki

ответ

2

Проблема была поднята на github и ответила @jangorecki, и этот ответ исходит из справочного документа setNumericRounding.

при присоединении или группировке, данные. Таблицы раундов такие данные для apx 11 s.f. для многих случаев это много цифр. Это достигается округлением последних 2 байтов от значения.

Как бы то ни было, мои 14-значные большие цифры, где округляются и поэтому объединены.

Как @jangorecki упоминает, этого можно избежать, установив setNumericRounding(0). Тем не менее, я лично переклассифицировал свои большие числовые коэффициенты. Это имеет смысл для моего конкретного случая использования.

В дополнение к этому @jangorecki также советует использовать пакет bit64 при работе с большими числами.

Оригинальный пост на github.

Смежные вопросы