在R中如何合并两个结构不同的Data Frame以得到指定结果?
R语言合并不同结构数据框并按规则提取值的实现方法
先还原你提到的两个数据框示例,方便直接运行测试:
# 创建Data Frame 1 df1 <- data.frame( GID_2 = c("MEX.15.1_1", "MEX.15.1_2", "MEX.15.1_3", "MEX.15.1_4", "MEX.15.1_5", "MEX.15.1_6") ) # 创建Data Frame 2 df2 <- data.frame( ID_MUNICIPIO = 1:6, B = c(500, NA, NA, NA, NA, 700), C = c(NA, 300, 600, NA, NA, NA), D = c(NA, NA, NA, 700, 800, NA) )
以下提供两种适合新手理解的实现方法:
方法一:提取ID后用条件判断赋值
- 从
GID_2中提取末尾数字,作为和df2匹配的ID_MUNICIPIO:
# 先安装dplyr包:install.packages("dplyr") library(dplyr) df1 <- df1 %>% mutate(ID_MUNICIPIO = as.integer(sub(".*_", "", GID_2))) # 提取下划线后的数字并转为整数
- 按规则用
case_when给X列赋值,最后保留目标列:
df_result <- df1 %>% left_join(df2, by = "ID_MUNICIPIO") %>% mutate( X = case_when( ID_MUNICIPIO == 1 ~ B, ID_MUNICIPIO == 2 ~ C, ID_MUNICIPIO == 3 ~ C, ID_MUNICIPIO == 4 ~ D, ID_MUNICIPIO == 5 ~ D, ID_MUNICIPIO == 6 ~ B ) ) %>% select(GID_2, X)
方法二:整理df2为长格式后匹配(规则变动时更灵活)
- 将df2转为长格式,保留有效数值:
df2_long <- df2 %>% pivot_longer(cols = c(B, C, D), names_to = "col", values_to = "X") %>% filter(!is.na(X))
- 创建规则映射表,指定每个ID对应的列:
rule_map <- data.frame( ID_MUNICIPIO = 1:6, col = c("B", "C", "C", "D", "D", "B") )
- 合并所有数据并提取目标列:
df_result <- df1 %>% mutate(ID_MUNICIPIO = as.integer(sub(".*_", "", GID_2))) %>% left_join(rule_map, by = "ID_MUNICIPIO") %>% left_join(df2_long, by = c("ID_MUNICIPIO", "col")) %>% select(GID_2, X)
运行任意一种方法后,df_result就是你需要的包含GID_2和X列的数据框。
内容的提问来源于stack exchange,提问作者Diego Plata
相关产品推荐
相关产品推荐

