按国家名列合并金融时间序列DataFrame的方法、转多维数组及full_join问题
金融时间序列DataFrame合并与处理问题解答
1. 按国家名列合并数据集的方法
有三类常用实现方式,覆盖不同工具链需求:
- 基础R原生方法
用merge()函数完成,支持多种连接类型,指定by = "country name"即可:# 全连接(保留所有国家的记录) merge(DataSet1, DataSet2, by = "country name", all = TRUE) # 批量合并多个数据集,用Reduce()循环处理 Reduce(function(x, y) merge(x, y, by = "country name", all = TRUE), list(DataSet1, DataSet2, DataSet3)) - dplyr包方法
用full_join()做全连接,多数据集可结合purrr::reduce()批量合并:library(dplyr) # 合并两个数据集 full_join(DataSet1, DataSet2, by = "country name") # 批量合并多个数据集 library(purrr) list(DataSet1, DataSet2, DataSet3) %>% reduce(full_join, by = "country name") - data.table包方法
适合大数据场景,处理速度更快,支持原生连接语法或merge():library(data.table) setDT(DataSet1) setDT(DataSet2) # 全连接 merge(DataSet1, DataSet2, by = "country name", all = TRUE)
2. 将合并结果转换为多维数组
合并后的数据集是宽格式,需先转长格式再构造「国家-年份-指标」维度的多维数组:
- 用
tidyr将宽格式转长格式(适配full_join自动生成的列名后缀):library(tidyr) library(dplyr) # 假设合并后的数据集叫merged_df,拆分年份和指标来源 long_df <- merged_df %>% pivot_longer( cols = -`country name`, names_to = c("year", "metric"), names_sep = "\\.", # 匹配full_join自动添加的.x/.y分隔符 values_to = "value" ) - 转换为多维数组,两种实用方式:
- 用
xtabs快速生成:array_data <- xtabs(value ~ `country name` + year + metric, data = long_df) - 手动定义维度构造:
# 获取各维度的唯一值 countries <- unique(long_df$`country name`) years <- unique(long_df$year) metrics <- unique(long_df$metric) # 生成数组 array_data <- array( long_df$value, dim = c(length(countries), length(years), length(metrics)), dimnames = list(country = countries, year = years, metric = metrics) )
- 用
3. full_join后列名改变导致无法访问的处理
full_join会给重名列自动添加.x(来自第一个数据集)、.y(来自第二个数据集)后缀,可通过三种方式解决:
- 合并前给列加前缀(推荐)
提前给每个数据集的年份列加专属标识,从根源避免重名:library(dplyr) # 给DataSet1的年份列加前缀metric1_ DataSet1_renamed <- DataSet1 %>% rename_with(~paste0("metric1_", .), -`country name`) # 给DataSet2的年份列加前缀metric2_ DataSet2_renamed <- DataSet2 %>% rename_with(~paste0("metric2_", .), -`country name`) # 合并后列名清晰,比如metric1_2005、metric2_2005 merged_df <- full_join(DataSet1_renamed, DataSet2_renamed, by = "country name") - 合并后重命名列
针对已合并的数据集,批量替换后缀:merged_df <- merged_df %>% rename_with(~sub("\\.x$", "_metric1", .), ends_with(".x")) %>% rename_with(~sub("\\.y$", "_metric2", .), ends_with(".y")) - 直接访问带后缀的列
临时访问时,用反引号包裹带特殊字符(点)的列名:# 访问DataSet1的2005列 merged_df$`2005.x` # 用dplyr的pull访问 merged_df %>% pull(`2005.x`)
内容的提问来源于stack exchange,提问作者thinkingdude
相关产品推荐
相关产品推荐

