R: есть ли способ связать столбцы без нумерации c - PullRequest
1 голос
/ 29 февраля 2020
library(Rmpfr)
mynumber <- new("mpfr", .Data = list(new("mpfr1", prec = 50L, exp = c(1045L, 
0L), sign = 1L, d = c(151748608L, -358118319L)), new("mpfr1", 
    prec = 50L, exp = c(20L, 0L), sign = 1L, d = c(-1114947584L, 
    -1905679017L)), new("mpfr1", prec = 50L, exp = c(-55L, -1L
), sign = 1L, d = c(-1449918464L, -906197701L)), new("mpfr1", 
    prec = 50L, exp = c(221L, 0L), sign = 1L, d = c(819707904L, 
    -1329031570L))))

mynumber - это объект класса mpfr с 4 числами в нем. Я хочу cbind mynumber со столбцом 0, то есть

> cbind(rep(0, 4), mynumber)
       mynumber
[1,] 0 ?       
[2,] 0 ?       
[3,] 0 ?       
[4,] 0 ?  

Это дает мне ???? во втором столбце, поэтому я попытался изменить mynumber на класс numeric first

mydata <- cbind(rep(0, 4), sapply(mynumber, asNumeric))
> mydata
     [,1]         [,2]
[1,]    0          Inf
[2,]    0 5.833223e+05
[3,]    0 2.189941e-17
[4,]    0 2.327185e+66

Однако, поскольку первое число в mynumber действительно большое, использование asNumeri c изменило его на Inf вместо.

Редактировать: Моя конечная цель - запустить:

mydata <- cbind(rep(0, 4), sapply(mynumber, asNumeric))
> mydata/rowSums(mydata)
     [,1] [,2]
[1,]    0  NaN
[2,]    0    1
[3,]    0    1
[4,]    0    1

, а не распечатать NaN.

Ответы [ 3 ]

1 голос
/ 29 февраля 2020

Один из вариантов - обернуть list, а затем создать объект tibble/data.frame, когда cbind преобразуется в matrix, а matrix может содержать только один класс

library(tibble)
tibble(col1 = 0, col2 = list(mynumber))
# A tibble: 1 x 2
#   col1 col2  
#  <dbl> <list>
#1     0 <mpfr>

cbind даже для классов character и numeric возвращает character для всех столбцов, и это не очень хороший вариант, если vector s для привязки другого класса

cbind(letters[1:4], 1:4)

Проверяя methods для cbind после загрузки пакета

methods('cbind')
#[1] cbind,ANY-method     cbind,Mnumber-method cbind.bigq*          cbind.bigz*         
#[5] cbind.data.frame     cbind.grouped_df*    cbind.ts*       

Таким образом, если он использовал правильные cbind методы для Mnumber, он не должен был давать Inf

cbind(rep(0,4),  mynumber)
#'mpfrMatrix' of dim(.) =  (4, 2) of precision  50 .. 53  bits 
#     [,1] [,2]                   
#[1,]   0. 3.4556867084990952e+314
#[2,]   0.      583322.33392099757
#[3,]   0.  2.1899410233914937e-17
#[4,]   0.  2.3271850367397449e+66

Или используйте повторное использование значения

cbind(0,  mynumber)
#'mpfrMatrix' of dim(.) =  (4, 2) of precision  50 .. 53  bits 
#     [,1] [,2]                   
#[1,]   0. 3.4556867084990952e+314
#[2,]   0.      583322.33392099757
#[3,]   0.  2.1899410233914937e-17
#[4,]   0.  2.3271850367397449e+66

Кроме того, если мы проверяем маскированные функции, когда мы загружаем пакет, он говорит

Следующие объекты маскируются из 'package: base':

cbind, pmax, pmin, rbind

Используя cbind из base, ? можно копировать. Возможно, что для OP cbind от base

base::cbind(0, mynumber)
#       mynumber
#[1,] 0 ?       
#[2,] 0 ?       
#[3,] 0 ?       
#[4,] 0 ?       

Если cbind из Rmpfr замаскировано, тогда используйте ::

mydata <- Rmpfr::cbind(0, mynumber)
mydata
#'mpfrMatrix' of dim(.) =  (4, 2) of precision  50 .. 53  bits 
#     [,1] [,2]                   
#[1,]   0. 3.4556867084990952e+314
#[2,]   0.      583322.33392099757
#[3,]   0.  2.1899410233914937e-17
#[4,]   0.  2.3271850367397449e+66




mydata/rowSums(mydata)
#'mpfrMatrix' of dim(.) =  (4, 2) of precision  53   bits 
#     [,1] [,2]              
#[1,]   0. 1.0000000000000000
#[2,]   0. 1.0000000000000000
#[3,]   0. 1.0000000000000000
#[4,]   0. 1.0000000000000000
0 голосов
/ 29 февраля 2020
zeros <- mpfr(c(0,0,0,0), precBits = getPrec(mynumber))
M <- cbind(mynumber, zeros)
M %*% t(M) # just to try
0 голосов
/ 29 февраля 2020

Интересно, что-то не так с вашим созданным объектом? Когда я изменил его, чтобы убедиться, что каждое поле exp имело только одно значение, я получил желаемый результат:

library(Rmpfr)

x <- new("mpfr", .Data = list(new("mpfr1", prec = 50L, exp = 1045L, 
    sign = 1L, d = c(151748608L, -358118319L)), new("mpfr1", 
    prec = 50L, exp = 20L, sign = 1L, d = c(-1114947584L, -1905679017L
    )), new("mpfr1", prec = 50L, exp = -55L, sign = 1L, d = c(-1449918464L, 
-906197701L)), new("mpfr1", prec = 50L, exp = 221L, sign = 1L, 
    d = c(819707904L, -1329031570L))))

cbind(c(0, 0, 0, 0), x)
#> 'mpfrMatrix' of dim(.) =  (4, 2) of precision  50 .. 53  bits 
#>      [,1] [,2]                   
#> [1,]   0. 3.4556867084990952e+314
#> [2,]   0.      583322.33392099757
#> [3,]   0.  2.1899410233914937e-17
#> [4,]   0.  2.3271850367397449e+66

Создано в 2020-02-29 пакетом представ. (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...