请求将凌乱的R数据处理代码改写为标准dplyr链式风格
整洁化dplyr风格代码改写方案
完整改写后的管道式代码
library(dplyr) library(tidyr) library(readxl) library(readr) new_long <- read_excel("data/ddd_dataset.xlsx") %>% # 筛选目标指标数据 filter(`Indicator name` == "Population covered by at least a 4G mobile network (%)") %>% # 移除指定行,保留所需列 slice(-c(1553, 1554)) %>% select(Country, Year, Value) %>% # 按国家名称排序 arrange(Country) %>% # 转换为宽表格式 pivot_wider(names_from = Year, values_from = Value) %>% # 执行数据插补:转长表处理后转回宽表 pivot_longer(-Country, names_to = "year") %>% mutate(value = as.numeric(value)) %>% group_by(Country) %>% fill(value, .direction = "updown") %>% pivot_wider(names_from = year, values_from = value) %>% # 合并国家名称映射表(直接在管道内处理映射表) left_join( read_csv("data/itu-emi-countries.csv") %>% rename(Country = `ITU Name`), by = "Country" ) %>% # 替换为EMI标准国家名称,保留前10列 mutate(Country = `EMI Name`) %>% select(1:10) %>% # 转换为最终的长表格式 pivot_longer(-Country, names_to = "year", values_to = "x") %>% mutate(across(year, as.numeric))
核心优化说明
- 全程使用
%>%管道串联所有操作,消除冗余中间变量,逻辑连贯易读 - 用dplyr的
filter()替代原生行索引筛选,slice()替代位置删除,select()替代列索引,完全贴合tidyverse语法 - 用tidyr的
pivot_wider()替代旧版spread(),保持函数的一致性和兼容性 - 修正
left_join()的参数错误:dplyr中统一使用by = "匹配列名",而非原生的by.x/by.y - 将国家映射表的读取、重命名直接整合进管道,避免单独创建中间对象
- 每一步添加简洁注释,明确代码功能,提升可维护性
内容的提问来源于stack exchange,提问作者Saïd Maanan
相关产品推荐
相关产品推荐

