如何使用dplyr统计多列数值的小数位数及每列最大小数位数
dplyr 实现统计 tibble 所有数值列的最大小数位数
核心实现方案
基于 dplyr + stringr 批量处理所有数值列,无需逐列硬编码,代码精简且效率更高:先定义单数值向量的最大小数位统计函数,再通过 across 批量作用到所有数值列即可。
完整代码
# 加载依赖包 library(tidyverse) # 定义单向量最大小数位计算函数 get_max_decimal <- function(x) { decimal_len <- str_extract(as.character(x), "\\.\\d+") %>% str_remove("\\.") %>% nchar() # 处理全为整数的边界情况 max_len <- max(decimal_len, na.rm = TRUE) return(ifelse(is.infinite(max_len), 0, max_len)) } # 批量统计所有数值列的最大小数位数,输出tibble格式结果 max_decimal_result <- data %>% summarise(across(where(is.numeric), get_max_decimal)) # 如果需要转为命名向量方便后续调用,加deframe()即可 # max_decimal_vec <- max_decimal_result %>% deframe()
原代码问题说明
你原来的代码问题主要有两点:
- 硬编码了
value_1列,仅能处理单列 - 用
rowwise逐行处理,数据量大时效率低,且生成大量中间冗余列
测试示例
用测试数据验证效果:
# 构造测试tibble test_data <- tibble( col1 = c(1.23, 4.567, 8, NA), col2 = c(0.1, 0.2345, 9.12, 3), col3 = 1:4 ) # 运行统计 test_data %>% summarise(across(where(is.numeric), get_max_decimal))
输出结果:
# A tibble: 1 × 3 col1 col2 col3 <dbl> <dbl> <dbl> 1 3 4 0
注意事项
R的浮点数存在精度误差,如果你的数值是经过计算得到的,直接转字符串可能会出现0.1 + 0.2 = 0.30000000000000004的情况,导致统计的小数位数偏大。如果是原始录入的精确小数,该方案完全适用;如果是计算生成的数值,可先做合理四舍五入后再统计。
内容的提问来源于stack exchange,提问作者C. Sebastian
相关产品推荐
相关产品推荐

