在 R 中使用 as.numeric() 时如何避免数字舍入?

Posted

技术标签:

【中文标题】在 R 中使用 as.numeric() 时如何避免数字舍入?【英文标题】:How to avoid number rounding when using as.numeric() in R? 【发布时间】:2020-01-07 13:15:56 【问题描述】:

我正在阅读 R 中结构良好的文本数据,并且在从字符转换为数字的过程中,数字会丢失小数位。

我曾尝试使用round(digits = 2),但由于我首先必须应用as.numeric,所以它不起作用。有一次,我确实在转换之前设置了options(digits = 2),但它也不起作用。

最终,我希望得到一个data.frame,它的数字与被视为字符的数字完全相同。

我在这里寻求帮助并确实找到了this、this 和this 之类的答案;但是,没有人真正帮助我解决了这个问题。

从字符转换为时如何防止数字舍入 数字?

这是我编写的一段可重现的代码。

library(purrr)
my_char = c("      246.00    222.22    197.98    135.10    101.50     86.45
            72.17     62.11     64.94     76.62    109.33    177.80")

# Break characters between spaces
my_char = strsplit(my_char, "\\s+")

head(my_char, n = 2)
#> [[1]]
#>  [1] ""       "246.00" "222.22" "197.98" "135.10" "101.50" "86.45" 
#>  [8] "72.17"  "62.11"  "64.94"  "76.62"  "109.33" "177.80"

# Convert from characters to numeric.
my_char = map_dfc(my_char, as.numeric)


head(my_char, n = 2)
#> # A tibble: 2 x 1
#>      V1
#>   <dbl>
#> 1    NA
#> 2   246

# Delete first value because it's empty
my_char = my_char[-1,1]

head(my_char, n = 2)
#> # A tibble: 2 x 1
#>      V1
#>   <dbl>
#> 1  246 
#> 2  222.

【问题讨论】:

sapply(my_char, as.numeric)? 您的数字未四舍五入。运行您发布的代码后查看sprintf("%0.17f", my_char[[1]]) 你确定不是打印方法限制了小数位数吗? 试试print.data.frame(na.omit(map_dfc(strsplit(my_char, "\\s+"), as.numeric)), digits = 4) 转换为真正的 R 数据框显示没有四舍五入,尝试as.data.frame(my_char) 【参考方案1】:

这就是 R 在 tibble 中可视化数据的方式。

map_dfc 函数不会对您的数据进行四舍五入,它只是 R 用来在 tibble 中显示数据的一种方式。

如果您想以通常的格式打印数据,请使用as.data.frame,如下所示:

head(as.data.frame(my_char), n = 4)
       V1
#>1  246.00
#>2  222.22
#>3  197.98
#>4  135.10

显示您的数据尚未四舍五入。

希望这会有所帮助。

【讨论】:

以上是关于在 R 中使用 as.numeric() 时如何避免数字舍入?的主要内容,如果未能解决你的问题,请参考以下文章

as.numeric() 删除 R 中的小数位,如何更改?

将向量从二进制强制转换为“as.numeric”时保留名称?

R语言as.numeric函数将因子变量(factor)转化为数值变量(Numeric)

将大型平面文件读入 r as.numeric 的快速方法 [重复]

R:as.numeric函数没有从data.frame返回正确的# [重复]

R 中的 as.numeric 有啥问题? [复制]