在RStudio中按索引分组行求和并更新原y列的技术问题
解决方案
问题分析
你的代码存在几个关键问题:
- 没必要用
rowwise(),按行处理会大幅降低千级列数下的运行效率,且get()在rowwise()的上下文里容易触发索引错误; - 代码逻辑是新建
yc开头的列,但你的需求是更新原y列,而非新增列; - 未处理移除
yb列的步骤。
方法一:用dplyr的across()直接更新(简洁直观)
不需要rowwise(),直接利用向量运算特性,让每列y和对应的yb列逐元素相加,最后移除yb列:
tmpB <- tmpA %>% mutate( across(starts_with("y"), ~ . + tmpA[[paste0("yb", substr(cur_column(), 2))]] ) ) %>% select(-starts_with("yb"))
解释:
cur_column()获取当前处理的y列名,substr(cur_column(), 2)提取出数字部分(比如从y0得到0);tmpA[[paste0("yb", ...)]]直接取出对应的yb列,和当前y列做向量相加,效率远高于按行处理;select(-starts_with("yb"))移除所有yb开头的列,保留其他变量。
方法二:矩阵运算(大列数下更高效)
当n达到1000时,矩阵运算的速度会比across()更快,适合处理大规模数据:
# 筛选y列和yb列的列名 y_cols <- stringr::str_starts(colnames(tmpA), "y") & !stringr::str_starts(colnames(tmpA), "yb") yb_cols <- stringr::str_starts(colnames(tmpA), "yb") # 矩阵相加更新y列 tmpA[y_cols] <- as.matrix(tmpA[y_cols]) + as.matrix(tmpA[yb_cols]) # 生成最终结果(移除yb列) tmpB <- tmpA %>% select(-yb_cols)
解释:
- 用字符串匹配精准筛选y列(排除yb列)和yb列;
- 转成矩阵后做元素级相加,这是R中最快速的批量数值运算方式;
- 最后移除yb列得到目标数据集。
原代码报错原因
rowwise()会让mutate()逐行处理,此时get(paste0("yb", substr(cur_column(), 2)))每次只能取单个值,而across()是列级操作,两者上下文冲突,导致索引或类型不匹配的错误。同时你没有处理更新原列和移除yb列的逻辑,不符合需求。
内容的提问来源于stack exchange,提问作者P Wong
相关产品推荐
相关产品推荐

