基于dplyr实现Lookup与Data数据集的区域别名匹配及指标计算
用dplyr实现高效的区域别名分配与指标计算
假设你的数据集结构如下(可根据实际字段名调整):
# 示例Lookup数据集 Lookup <- tibble(Region = c("A", "B", "C", "D")) # 示例Data数据集 Data <- tibble( Region = c("A", "A", "B", "C", "C", "C", "D"), Number = c(0.45, 0.28, 0.35, 0.5, 0.32, 0.25, 0.1), Alias = c("Alias_A1", "Alias_A2", "Alias_B1", "Alias_C1", "Alias_C2", "Alias_C3", "Alias_D1") )
以下是替代循环的高效dplyr解决方案:
library(dplyr) library(stringr) # 1. 预处理Data:筛选符合条件的记录,分组聚合生成衍生指标 processed_data <- Data %>% # 筛选Number>0.30的记录 filter(Number > 0.30) %>% # 按区域分组 group_by(Region) %>% # 组内按Number降序排序,确保别名顺序正确 arrange(desc(Number), .by_group = TRUE) %>% # 聚合生成所需指标 summarise( New_Name = str_c(Alias, collapse = ", "), # 按降序拼接别名成字符串 Revised_Name_Number = n(), # 满足条件的别名数量 Max_Number = max(Number), # 该区域最大Number值 Avg_Number = mean(Number) # 该区域平均Number值 # 可根据需求添加其他衍生指标 ) %>% ungroup() # 2. 关联Lookup与预处理后的Data,保留所有Lookup区域 final_result <- Lookup %>% left_join(processed_data, by = "Region") %>% # 为无符合条件记录的区域填充默认值 mutate( New_Name = ifelse(is.na(New_Name), "", New_Name), Revised_Name_Number = ifelse(is.na(Revised_Name_Number), 0, Revised_Name_Number), Max_Number = ifelse(is.na(Max_Number), 0, Max_Number), Avg_Number = ifelse(is.na(Avg_Number), 0, Avg_Number) )
代码说明
- 筛选与分组:先用
filter过滤出Number>0.30的记录,再按Region分组,确保每个区域的处理独立; - 排序与聚合:
arrange保证组内记录按Number降序排列,summarise批量生成所有衍生指标,其中str_c用于拼接别名字符串,n()统计符合条件的别名数量; - 关联与补全:通过
left_join保留Lookup中的所有区域,再用mutate处理缺失值,避免结果中出现NA; - 效率优势:dplyr采用向量化操作,比循环更高效,尤其在数据集较大时表现更明显。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

