首页 > 解决方案 > 什么是错误:无法从由于精度损失。在 R 中

问题描述

我之前运行过这段代码,从未出现过错误。

 df.new <- df1

for(i in 1:nrow(df1)){
  df.new[j,] <- df1[j,]/df2$specificCol[j]
  
}
  

举个例子,

df1[1,1]/df2$specificCol[1] = 6.179306e-06

当我只想手动设置 df.new[1,1] 这个数字时,我得到了错误。

df.new[1,1] <-6.179306e-06

但是这次我收到了这个错误

Error: Assigned data `6.179306e-06` must be compatible with existing data.
i Error occurred for column `x1`.
x Can't convert from <double> to <integer> due to loss of precision.
* Locations: 1.
Run `rlang::last_error()` to see where the error occurred.

我应该如何解决这个错误?

附言。感谢@user20650,以防其他人需要这个:写一个s.data.frame(df.new)而不是df.new(这对is.data.frame(df.new).
我不知道为什么但是这有效!

标签: rdataframematrixerror-handling

解决方案


我不知道为什么这在过去对你有用并且停止了工作(也许包含tibble包的 tidyverse 发生了变化,但我没有遇到任何明显的问题)但这里有一个关于问题的简短解释:

df = tibble::tibble(x=1L:2L)

如果我们选择df[1,1]我们得到:

str(df[1,1])
# tibble [1 × 1] (S3: tbl_df/tbl/data.frame)
# $ x: int 1

也就是说,我们得到一个 1x1 类型的 tibble integer。当我们尝试用非整数值(例如df[1,1] <- 1.2)替换这个元素时,R 会抱怨。

有几种方法可以解决这个问题。

  • 如果我们使用[[-indexing 而不是[,索引,则-extraction[[会给我们一个向量而不是一个小标题。df[[1]][1] <- 1.2工作,并将整个列强制为double(浮点)类型。
  • df <- as.data.frame(df); df[1,1] <- 1.2也可以,因为 base-R 数据帧与 tibbles 有不同的规则;特别df[,1]是向量而不是数据框
  • 我们还可以将列显式转换为双精度类型;df[[1]] <- as.double(df[[1]]); df[1,1] <- 1.2也有效。

基本上,小标题说即使i是单元素向量,df[,i]也始终是单列小标题,而不是降级为向量,并且用不同类型的元素替换元素很麻烦(尽管大多数时候 R 是在有意义时允许您在不同的数据类型之间进行相互转换非常松懈)。


推荐阅读