在mutate()中使用str_extract_all无法实现逐行数字求和的求助
解决方案
针对数据框每行提取ID字段中1-3的数字并求和,你可以通过以下几种方式实现:
方法1:使用dplyr的行分组(rowwise)
通过rowwise()让每行独立处理,结合str_extract_all提取数字后求和:
library(dplyr) library(stringr) test <- data.frame(ID=c("2VG1AR", "1OR2AG", "1GV1OA"), value = c(4,8,2)) # 计算每行数字和并添加新列 test_processed <- test %>% rowwise() %>% mutate(num_sum = sum(as.numeric(str_extract_all(ID, "[1-3]", simplify = TRUE)))) %>% ungroup() # 查看结果 test_processed
输出:
ID value num_sum 1 2VG1AR 4 3 2 1OR2AG 8 3 3 1GV1OA 2 2
这里正则[1-3]精准匹配单个1/2/3数字,避免了原正则可能匹配到无关符号的问题。rowwise()确保每行单独计算,最后ungroup()取消行分组恢复数据框默认结构。
方法2:使用purrr的map_dbl(高效无分组)
如果不想用行分组,purrr::map_dbl可以直接遍历str_extract_all返回的列表,对每个元素求和:
library(dplyr) library(stringr) library(purrr) test_processed <- test %>% mutate(num_sum = map_dbl(str_extract_all(ID, "[1-3]"), ~sum(as.numeric(.x))))
该方法无需分组,性能更优,适合处理大规模数据。
方法3:Base R 实现(无额外依赖)
如果不想加载tidyverse包,用base R的sapply也能完成:
library(stringr) test$num_sum <- sapply(str_extract_all(test$ID, "[1-3]"), function(x) sum(as.numeric(x)))
内容的提问来源于stack exchange,提问作者ghaines
相关产品推荐
相关产品推荐

