2015-02-01 8 views
8

У меня есть кадр данных, состоящий полностью из столбцов integer64, которые я бы хотел преобразовать в качестве матрицы.Как преобразовать фрейм данных из значений integer64 в матрицу?

library(bit64) 
(dfr <- data.frame(x = as.integer64(10^(9:18)))) 
##      x 
## 1   1000000000 
## 2   10000000000 
## 3   100000000000 
## 4  1000000000000 
## 5  10000000000000 
## 6  100000000000000 
## 7  1000000000000000 
## 8 10000000000000000 
## 9 100000000000000000 
## 10 1000000000000000000 

К сожалению, as.matrix не дает правильный ответ.

(m <- as.matrix(dfr)) 
##     x 
## [1,] 4.940656e-315 
## [2,] 4.940656e-314 
## [3,] 4.940656e-313 
## [4,] 4.940656e-312 
## [5,] 4.940656e-311 
## [6,] 4.940656e-310 
## [7,] 4.940656e-309 
## [8,] 5.431165e-308 
## [9,] 5.620396e-302 
## [10,] 7.832953e-242 

Проблема, кажется, что integer64 значения хранятся в виде числовых значений с «integer64» атрибута класса (плюс некоторые магии сделать их печать и выполнять арифметические действия правильно), который получает раздели as.matrix.

Я не могу просто сделать class(m) <- "integer64", потому что это изменяет класс объекта матрицы, а не его содержимое.

Аналогичным образом, mode(m) <- "integer64" дает неправильный ответ и typeof(m) <- "integer64" и storage.mode(m) <- "integer64" ошибки ввода.

Конечно, я мог бы просто обойти проблему, преобразовывая столбцы в двойное (dfr$x <- as.double(dfr$x)), но похоже, что это должен быть способ сделать это правильно.

Как получить матрицу значений integer64?

+4

Возможно, вы направляетесь вниз темный путь: если все * функции * вы собираетесь подавать свою матрицу, чтобы иметь методы «integer64», вы все равно в конечном итоге все равно сходитесь к удвоениям. Имеет ли пакет 'bit64' набор соответствующих методов, и в этом случае у него есть некоторый инструмент' as.matrix64'? Если нет, вы можете также преобразовать в двойные или, возможно, использовать пакеты 'gmp' и' Rmpfr'. ETA: слово «матрица» даже не отображается в файле справки для «бит64», поэтому я думаю, вам придется придерживаться данных и доступных для этого методов. –

+3

@CarlWitthoft, но ох смотреть на блестящий шар, отскакивающий в темные, запутанные леса, из которых нет надежды на возвращение, может быть, я должен пойти преследовать его. –

ответ

4

Для исходного вектора, назначая атрибут dim непосредственно, кажется, работает:

> z <- as.integer64(1:10) 
> z 
integer64 
[1] 1 2 3 4 5 6 7 8 9 10 
> dim(z) <- c(10, 1) 
> z 
integer64 
     [,1] 
[1,] 1 
[2,] 2 
[3,] 3 
[4,] 4 
[5,] 5 
[6,] 6 
[7,] 7 
[8,] 8 
[9,] 9 
[10,] 10 

Для кадра данных, cbind ИНГ столбцов также работает:

> df <- data.frame(x=as.integer64(1:5), y=as.integer64(6:10)) 
> df 
    x y 
1 1 6 
2 2 7 
3 3 8 
4 4 9 
5 5 10 
> cbind(df$x, df$y) 
integer64 
    [,1] [,2] 
[1,] 1 6 
[2,] 2 7 
[3,] 3 8 
[4,] 4 9 
[5,] 5 10 

Таким образом, для произвольного числа столбцов, do.call - это путь:

> do.call(cbind, df) 
integer64 
    x y 
[1,] 1 6 
[2,] 2 7 
[3,] 3 8 
[4,] 4 9 
[5,] 5 10