如何将R语言的数字求和函数向量化以处理数字向量?
向量化实现R语言数字向量的各位数字求和函数
当然可以实现无需遍历元素的向量化版本,以下提供两种高效的向量化解决方案:
方法一:纯数学运算实现
基于你找到的单元素函数思路,通过矩阵运算实现完全向量化:
vector_digitsum <- function(x) { # 获取每个数字的位数 digit_counts <- nchar(x) # 生成每个数字对应的10的幂次矩阵(超出位数的位置用NA填充) power_matrix <- 10^(outer(0:max(digit_counts - 1), seq_along(x), function(p, idx) if (p < digit_counts[idx]) p else NA)) # 计算各位数字并求和,忽略NA值 rowSums(floor(x / power_matrix) %% 10, na.rm = TRUE) }
测试示例:
test_vec <- c(1, 11, 1232, 4221, 2) vector_digitsum(test_vec) # 输出结果:[1] 1 2 8 9 2
这个方法通过outer()生成适配每个数字位数的幂次矩阵,利用R的向量化运算特性完成批量计算,完全避免了逐个元素遍历。
方法二:字符串处理实现
利用字符串拆分的向量化特性,代码更简洁直观:
vector_digitsum_str <- function(x) { # 将数字转为字符串并拆分,返回矩阵格式 digit_matrix <- strsplit(as.character(x), "", simplify = TRUE) # 转换为整数矩阵后按行求和 rowSums(as.integer(digit_matrix)) }
测试示例:
vector_digitsum_str(test_vec) # 输出结果:[1] 1 2 8 9 2
strsplit()的simplify=TRUE参数会返回一个行数与输入向量长度一致的矩阵,后续的类型转换和行求和都是纯向量化操作。
内容的提问来源于stack exchange,提问作者BoTz
相关产品推荐
相关产品推荐

