You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:54:01