什么是错误:<double> <integer> 由于精度损失,无法从 to 转换。 在 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.

我应该如何修复这个错误?

p。感谢@user20650,以防有人需要这个:写一个s.data.frame(df.new)而不是df.new就足够了(这对is.data.frame(df.new)来说是真实的。
我不知道为什么,但这是有效的!

我不知道为什么这在过去为您工作并停止工作(也许在包含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

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

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

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

基本上,tibbles表明,即使i是一个单元素向量,df[,i]始终是一个单列tibble,而不是被降级为一个向量,并且它对用不同类型的元素替换元素很挑剔(即使大多数时间R非常宽松,允许您在不同的数据类型之间进行转换当它有意义时)。

最新更新