【问题标题】:R: is there a way to cbind non-numeric columnsR:有没有办法 cbind 非数字列
【发布时间】:2020-02-29 20:16:09
【问题描述】:
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 个数字。我想cbindmynumber有一列0,即

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

这给了我????在第二列中,所以我尝试先将mynumber 更改为numeric

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 中的第一个数字非常大,因此使用 asNumeric 将其更改为 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。

【问题讨论】:

  • mynumber 是我从Rmpfr 调用函数mpfr 的结果。我应该提供有关包裹的任何其他信息吗?

标签: r precision numeric cbind


【解决方案1】:

一种选择是用list 包装,然后创建一个tibble/data.frame 对象,因为cbind 转换为matrixmatrix 只能容纳一个类

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

cbind 即使在 characternumeric 类上也会为所有列返回 character,当要绑定的 vectors 属于不同类时,这不是一个好的选择

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*       

所以,如果它对Mnumber 使用正确的cbind 方法,它就不应该给出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

通过使用base 中的cbind,可以复制?。对于 OP,cbind 可能来自 base

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

如果来自Rmpfrcbind 被屏蔽,则使用::

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

【讨论】:

  • 谢谢。我有一个后续问题,假设我有mydata &lt;- cbind(rep(0, 4), sapply(mynumber, asNumeric))。当我打电话给mydata/rowSums(mydata) 时,它给了我一个NaN。有没有办法使用tibble 来解决这个问题?我编辑了我原来的问题。
  • 那我们就用mydata &lt;- cbind(seq(1, 4, 1), sapply(mynumber, asNumeric))吧。
  • 谢谢。如何确保对Mnumber 使用cbind 方法?
【解决方案2】:

我想知道您创建的对象是否有问题。当我更改它以确保每个 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

reprex package (v0.3.0) 于 2020 年 2 月 29 日创建

【讨论】:

  • 当我尝试运行x &lt;- new(....) 时,出现以下错误:Error in validObject(.Object) : invalid class “mpfr1” object: invalid 'exp' slot for 64-bit gmp.numbbits: must have length 2。不知道这意味着什么?
  • @Adrian 我猜这是因为我使用的是 32 位架构,而您使用的是 64 位架构。我怀疑这是 @akrun 所说的 cbind 版本的问题
【解决方案3】:
zeros <- mpfr(c(0,0,0,0), precBits = getPrec(mynumber))
M <- cbind(mynumber, zeros)
M %*% t(M) # just to try

【讨论】:

  • 谢谢。我收到以下错误:Error in base::"%*%"(x, y) : requires numeric/complex matrix/vector arguments。我想使用另一个包中的%*% 运算符吗?
  • @Adrian Strange。我刚刚加载了Rmpfr,它提供了这个运算符。
猜你喜欢
  • 2013-10-05
  • 1970-01-01
  • 2016-01-05
  • 2020-04-16
  • 2021-11-16
  • 2014-09-26
  • 2021-06-22
  • 1970-01-01
  • 2019-05-15
相关资源
最近更新 更多