Вот еще один подход, который кажется более прямолинейным, чем мой ответ год назад:
Разделить один вектор:
a1 <- c('1234567891234567891234567891234567891234')
a2 <- read.fwf(textConnection(a1), widths=rep(1, nchar(a1)), colClasses = 'numeric', header=FALSE)
a2
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40
1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4
Прочитайте файл, содержащий следующие три длинных числа одинаковой длины:
# 1234567891234567891234567891234567891234
# 1888678912345678912345678912345678912388
# 1234999891234567891234567891234567891239
a1 <- read.table("c:/users/mmiller21/simple R programs/three_long_numbers.txt", colClasses = 'character', header = FALSE)
a2 <- read.fwf("c:/users/mmiller21/simple R programs/three_long_numbers.txt", widths=rep(1, max(nchar(a1$V1))), colClasses = 'numeric', header=FALSE)
a2
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40
1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4
2 1 8 8 8 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 8 8
3 1 2 3 4 9 9 9 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 9
Считайте файл, содержащий следующие три длинных числа неравной длины:
# 1234567891234567891234567891234567891234
# 188867891234567891234567891234567891238
# 12349998912345678912345678912345678912
a1 <- read.table("c:/users/mmiller21/simple R programs/three_long_numbersb.txt", colClasses = 'character', header = FALSE)
a2 <- read.fwf("c:/users/mmiller21/simple R programs/three_long_numbersb.txt", widths=rep(1, max(nchar(a1$V1))), colClasses = 'numeric', header=FALSE)
a2
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40
1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4
2 1 8 8 8 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 8 NA
3 1 2 3 4 9 9 9 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 NA NA
Вот код для разделения одного столбца длинных чисел в файле данных, который содержит несколько столбцов. В этом примере все числа в столбце 2 имеют одинаковую длину:
# -10 1234567891234567891234567891234567891234 -100
# -20 1888678912345678912345678912345678912388 -200
# -30 1234999891234567891234567891234567891239 -300
a1 <- read.table("c:/users/mark w miller/simple R programs/three_long_numbers_Oct25_2013.txt", colClasses = c('numeric', 'character', 'numeric'), header = FALSE)
a2 <- read.fwf(textConnection(a1$V2), widths=rep(1, nchar(a1$V2)[1]), colClasses = 'numeric', header=FALSE)
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40
1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4
2 1 8 8 8 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 8 8
3 1 2 3 4 9 9 9 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 9
person
Mark Miller
schedule
23.07.2013
strsplit
выдает ошибку - person rvrvrv   schedule 03.06.2012options("digits")
равно 22 ; Я не уверен в максимальной точности, которую R может удерживать в переменнойnumeric
, но я думаю, что ваше значение больше этого. Возможно, вы захотите просмотреть некоторые из ответов SO на ваши варианты арифметики произвольной точности (в основном с использованием интерфейсов для инструментов, отличных от R, таких какbc
): например, stackoverflow.com/questions/8175965/ - person Ben Bolker   schedule 03.06.2012xc <- "123456789123456789123456789"; x <- as.numeric(xc); dump("x","")
- person Ben Bolker   schedule 03.06.2012int64
, и даже беззнаковые 64-битные целые числа дают вам только 20 цифр ...library(int64); as.character(numeric_limits("uint64"))
- person Ben Bolker   schedule 03.06.2012options("digits")
указывает только количество десятичных знаков, которое показывает R, а не число, которое он поддерживает и использует для вычислений? Невозможно перейти от числового к символьному, поскольку R, по-видимому, использует1.2345e+35
вместо целого числа, и, таким образом, это то, что возвращается как символ. Данные извлекаются из базы данных MySQL, поэтому я вернулся туда и изменил категорию сVARCHAR
наCHAR
(но, к сожалению, пришлось переделать все управление данными). Таким образом, моя проблема решена, но преобразование числа в символ с использованием больших чисел все еще остается проблемой. - person rvrvrv   schedule 04.06.2012options('digits')
управляет только печатью. R выполняет все вычисления с двойной точностью, которая (как я уже говорил в предыдущем комментарии) ограничена примерно 16-ю цифрами точности. СтолбецVARCHAR
не является проблемой, поскольку ваша БД хранит значение в виде строки. Проблема в том, что любой метод, который вы использовали для извлечения данных в R, преобразовывал это поле в числовое. - person Joshua Ulrich   schedule 04.06.2012