Я работаю с data.table
, считанным из файла .txt с fread
.data.table
содержит некоторое количество integer
столбцов, а также столбец с очень большими целыми числами, которые я намерен хранить как bigz
.Тем не менее, fread
будет читать только большие целые числа как character
, если я планирую сохранить все цифры (и я так и сделаю).
#Something to the effect of (run not needed):
#fread(file = FILENAME.txt, header=TRUE, colClasses = c(rep("integer", 10), "character"), data.table = TRUE)
Кроме того, я работаю с довольно большим набором данных.Моя основная проблема - преобразование столбца character
в столбце data.table
в столбец bigz
без создания нового объекта.
Вот игрушечный пример, которыйдемонстрирует мою проблему.Во-первых, я знаю, что data.table
s может иметь bigz
столбцы - IF они вводятся в новый объект.
library(gmp)
library(data.table)
exa = as.bigz(2)^80 #A very large number
cha = as.character(exa) #The same number in character form
(good = data.table(nums = 1:3, lets = letters[1:3], bigs = rep(exa, 3)))
str(good) #Notice "bigs" is type bigz (and raw?)
Однако, если столбец character
должен быть преобразован в столбец bigz
на лету, возникает ошибка.Синтаксис в этих методах преобразования «работает» в столбце numeric
nums
, если as.bigz
заменен на as.character
.
(bad = data.table(nums = 1:3, lets = letters[1:3], bigs = rep(cha, 3)))
str(bad)
#Method 1
bad[,bigs:=as.bigz(bigs)]
#Method 2 (re-create data.table first)
bad = data.table(nums = 1:3, lets = letters[1:3], bigs = rep(cha, 3))
set(bad, j="bigs", value = as.bigz(bad$bigs))
Ошибка ниже.Похоже, что проблема связана с тем, что bigz
целые числа хранятся как raw
, хотя я не уверен, откуда исходит 64 - exa
имеет 24 цифры.
Warning messages:
1: In `[.data.table`(bad, , `:=`(bigs, as.bigz(bigs))) :
Supplied 64 items to be assigned to 3 items of column 'bigs' (61 unused)
2: In `[.data.table`(bad, , `:=`(bigs, as.bigz(bigs))) :
Coerced 'raw' RHS to 'character' to match the column's type. Either change the target column ['bigs'] to 'raw' first (by creating a new 'raw' vector length 3 (nrows of entire table) and assign that; i.e. 'replace' column), or coerce RHS to 'character' (e.g. 1L, NA_[real|integer]_, as.*, etc) to make your intent clear and for speed. Or, set the column type correctly up front when you create the table and stick to it, please.
У меня есть обходной путь, но он требует создания нового объекта (и удаления старого).
(bad = data.table(nums = 1:3, lets = letters[1:3], bigs = rep(cha, 3)))
meh = data.table(as.data.frame(bad)[,-3], bigs = as.bigz(bad$bigs))
rm(bad)
str(meh)
identical(good, meh) #Well, at least this works
Я думаю, что эту ситуацию можно решить, если:
fread
может прочитать в bigz
целых числах, или - есть способизменить тип столбца без создания нового объекта.
По общему признанию, я data.table
новичок.Заранее спасибо!