我以前运行过这段代码,从来没有出现过错误。
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非常宽松,允许您在不同的数据类型之间进行转换当它有意义时)。