data.table使用by参数时警告信息不一致的原因探究
data.table分组生成新列时类型转换警告的原因解析
在使用data.table的by参数按分组引用生成新列时,当不同分组返回的数据类型不同(如整数int和数值num),会被强制转换为同一类型,但以下两个示例中,第一个无警告,第二个却出现类型转换警告,具体代码如下:
library(data.table) DT <- data.table(a = c("rpois", "rnorm")) # 示例1:无警告 DT[, b := ifelse(a == "rpois", 1L, 1.0), by = "a"] # 示例2:出现警告 set.seed(6) DT[, c := match.fun(a)(1, 1), by = "a"] str(DT)
示例1无警告的原因
按a分组后,每个分组内的ifelse仅执行对应分支:
- 当
a="rpois"时,仅返回1L(整数类型); - 当
a="rnorm"时,仅返回1.0(数值类型)。
虽然两个分组返回类型不同,但1.0转换为整数1L没有任何精度损失,data.table可以安全完成类型转换,因此不会触发警告。
示例2出现警告的原因
按a分组后,两个分组的返回结果存在本质差异:
a="rpois"分组调用rpois(1,1),返回整数类型向量(rpois的输出默认是integer);a="rnorm"分组调用rnorm(1,1),返回数值类型向量(rnorm的输出默认是numeric),且在set.seed(6)的情况下,该值为1.872765(非整数)。
data.table在合并分组结果时,会以第一个分组的类型作为目标类型(此处为integer),因此需要将第二个分组的非整数数值转换为整数。由于转换过程中会截断小数部分(1.872765转为1L),存在精度丢失,因此触发了类型转换警告。
内容的提问来源于stack exchange,提问作者John Snider
相关产品推荐
相关产品推荐

