R语言指定列行求和代码子集可用全量数据集报错问题
R中分组数据框行求和报错的解决方法
问题场景
现有一份包含9万余条观测、400个患者诊断相关变量的大型R数据集,需要对Code1至Code200列做行向求和,结果存入新列mytotal。
以下代码在2000条观测的子集上运行正常:
mysubset <- mysubset %>% mutate(mytotal = select(., Code1:Code200) %>% rowSums(na.rm = TRUE))
但在数据结构完全一致的9万条全量数据集上运行相同代码时,抛出如下报错:
Adding missing grouping variables: `patient_num` Error in `mutate()`: ! Problem while computing `utils = select(., Code1:Code200) %>% rowSums(na.rm = TRUE)`. ✖ `utils` must be size 1, not 92574. ℹ The error occurred in group 1: patient_num = 123456789.
检索数小时未找到可行解决方案或替代实现,需要对应解决思路。
报错原因
报错核心是全量数据集为分组数据框(grouped dataframe),测试用的子集未保留分组属性。
带分组属性的数据集执行mutate时,会按每个独立分组拆分后运行计算逻辑:代码中嵌套的select(., Code1:Code200) %>% rowSums(na.rm = TRUE)在分组计算环境中,会返回全量数据集所有行的求和结果(长度为全量总行数92574),和当前分组的行数不匹配,因此触发长度校验报错,同时提示缺失分组变量patient_num。
解决方案
方案1:解除分组后运行原代码
计算前调用ungroup()移除数据集的分组属性即可正常运行原逻辑,如果后续需要保留分组,可以在计算完成后重新按原字段分组:
# 解除分组后计算 mydata <- mydata %>% ungroup() %>% mutate(mytotal = select(., Code1:Code200) %>% rowSums(na.rm = TRUE))
方案2:使用dplyr原生行计算写法(推荐)
用across()选取待计算列,不需要嵌套select,在分组、未分组数据集上都能稳定运行,不会出现长度匹配问题:
mydata <- mydata %>% mutate(mytotal = rowSums(across(Code1:Code200), na.rm = TRUE))
内容的提问来源于stack exchange,提问作者dani
相关产品推荐
相关产品推荐

