如何在R中对指定前缀列按行求和且灵活处理NA值?
解决方案
针对你的需求,推荐两种高效实现方式,优先选择向量运算方案适配大型数据集:
方案一:基于rowSums的高效实现(推荐)
利用rowSums的向量运算特性快速求和,再通过if_all判断全NA行并修正结果,兼顾效率与需求:
library(dplyr) df <- df %>% mutate( # 先忽略NA完成求和 a1_sum = rowSums(select(., starts_with('a1')), na.rm = TRUE), # 若前缀匹配的所有列均为NA,将求和结果替换为NA a1_sum = if_else(if_all(starts_with('a1'), is.na), NA_real_, a1_sum) )
方案二:基于rowwise的直观实现
如果更看重代码可读性,可使用rowwise结合c_across,但该方式在大型数据集上效率低于方案一:
df <- df %>% rowwise() %>% mutate( a1_sum = case_when( all(is.na(c_across(starts_with('a1')))) ~ NA_real_, TRUE ~ sum(c_across(starts_with('a1')), na.rm = TRUE) ) ) %>% ungroup()
为什么hablar::sum_效率低?
hablar::sum_本质是逐行循环处理,没有利用R的向量运算优化机制,在大型数据集上会导致计算耗时剧增,因此不推荐用于此类场景。
内容的提问来源于stack exchange,提问作者Andres Gonzalez
相关产品推荐
相关产品推荐

