R中dataframe字符串列转超大整数时gmp::as.bigz报错如何处理
错误原因
你遇到的报错是两个问题共同导致的:
- 旧版dplyr的
mutate_at+匿名函数的语法在处理gmp包返回的bigz类型S3向量时,无法正确识别该向量的长度属性,错误将其底层存储的原始数组直接展开,导致返回长度与数据框1636626的行数不匹配 list(~gmp::as.bigz(.,mod = NA))的写法在mutate_at中会被识别为生成新列的逻辑,进一步加剧了列长度匹配的异常
解决方案
优先用新版dplyr的标准mutate语法直接进行矢量化转换,该写法效率最高,适配百万行级别的数据:
library(dplyr) library(gmp) bd <- bd %>% mutate(hst = gmp::as.bigz(hst, mod = NA))
如果上述写法依然触发长度不匹配报错,说明你当前环境的dplyr版本对非基础类型列的支持存在缺陷,可以改用按元素转换的方式生成list类型的bigz列,gmp的算术运算完全支持该格式:
library(dplyr) library(purrr) library(gmp) bd <- bd %>% mutate(hst = purrr::map(hst, ~gmp::as.bigz(.x, mod = NA)))
验证方法
转换完成后可通过以下命令验证效果:
- 查看列类型:
class(bd$hst) - 验证单值的bigz类型:
gmp::is.bigz(bd$hst[1])(list列则用gmp::is.bigz(bd$hst[[1]])) - 打印单值确认数位完整:
print(bd$hst[1])
注意事项
加载gmp包后可直接用+/-/*等运算符对bigz类型的值进行算术运算,无需调用额外的函数,运算结果会自动保留所有数位不会溢出。
内容的提问来源于stack exchange,提问作者Stella
相关产品推荐
相关产品推荐

