在 R 中 mpfr'izing data.frame

mpfr'izing a data.frame in R

我正在尝试通过乘以 mpfr 单位常数将 R 中的 data.frame 转换为 mpfr 格式。如以下代码所示,当应用于列(结果变量 'mpfr_col')时,此方法有效,但对于使用 data.frame 显示的两种方法,它不起作用。每次尝试的相关错误都列在注释中。

library(Rmpfr)

prec <- 256
m1 <- mpfr(1,prec)
col_build <- 1:10
test_df <- data.frame(col_build, col_build, col_build)
mpfr_col <- m1*(col_build)
mpfr_df <- m1*test_df # (list) object cannot be coerced to type 'double'

for(colnum in 1:length(colnames(test_df))){
  test_df[,colnum] <- m1*test_df[,colnum] # attempt to replicate an object of type 'S4'
}

答案:

使用 [[colnum]] 访问列而不是 [,colnum]:

for(colnum in length(colnames(test_df))){
  test_df[[colnum]] <- m1*test_df[[colnum]] 
}

(注意:data.frameprint 方法会失败,但是 'mpfr-izing' 可以。您可以通过单独打印列或使用 as_tibble(test_df) 来打印它.

说明

原来的失败是因为 [,colnum] 赋值没有强制转换参数,我想。使用 [[ returns 列表的一个元素(又名列)(又名 data.frame)。

查看 Hadley Wickham 的 Advanced R 书中的这一点:

  1. [ selects sub-lists. It always returns a list; if you use it with a single positive integer, it returns a list of length one. [[ selects an element within a list. $ is a convenient shorthand: x$y is equivalent to x[["y"]].

还有来自Extract.data.frame {base}的帮助:

When [ and [[ are used to add or replace a whole column, no coercion takes place but value will be replicated (by calling the generic function rep) to the right length if an exact number of repeats can be used.