如何在R中合并拆分的非平衡数据集并整理为干净数据?
解决方法
你的问题核心是要将原始数据中a_name非空和b_name非空的两部分按min.distance匹配合并,同时保留所有未匹配的记录。之前用left_join效果不佳是因为它只能保留左表的全部记录,会丢失另一部分未匹配的数据,需要用全连接+字段整理的方式处理。
步骤1:构造/读取原始数据
首先确保原始数据中的空值被正确识别为NA,如果是从文本文件读取,使用read.table(..., na.strings = "")。这里先构造你给出的数据集:
raw_data <- data.frame( a_name = c(rep(NA,7), "jongone", "jongtwo", "jongthree", "jongfour", "jongfive"), b_name = c("kangseo", "kangbook", "jongro", "dongmoon", "jamsil", "nolboo", "ilsan", rep(NA,5)), latitude = c(37.1562, 38.1255, 37.8226, 37.1161, 36.1215, 37.3213, 37.1111, 38.1241, 37.1161, 37.1562, 37.1551, 36.1515), longitude = c(126.9762, 126.1952, 127.1724, 127.1345, 127.9722, 127.3211, 127.1331, 126.1215, 127.1345, 126.9762, 127.6262, 127.9627), min.distance = c(73.950928, 128.179185, 95.626161, 12.531519, 175.154161, 85.151616, 16.115151, 95.626161, 12.531519, 73.950928, 17.124115, 175.154161) )
步骤2:拆分数据集
将原始数据拆分为两个子集,分别存放a_name和b_name的有效数据:
library(dplyr) # 提取a_name非空的行,保留经纬度 df_a <- raw_data %>% filter(!is.na(a_name)) %>% select(a_name, min.distance, lat_a = latitude, lon_a = longitude) # 提取b_name非空的行,保留经纬度 df_b <- raw_data %>% filter(!is.na(b_name)) %>% select(b_name, min.distance, lat_b = latitude, lon_b = longitude)
步骤3:全连接并整理字段
使用full_join保留所有记录,然后按规则整理每个字段:
- 匹配到的行合并a_name和b_name
- 经纬度优先保留a_name对应的数值(如果存在),否则用b_name的
- 去重并调整顺序对齐你的预期结果
clean_data <- full_join(df_a, df_b, by = "min.distance") %>% mutate( a_name = ifelse(!is.na(a_name), a_name, NA), b_name = ifelse(!is.na(b_name), b_name, NA), latitude = ifelse(!is.na(lat_a), lat_a, lat_b), longitude = ifelse(!is.na(lon_a), lon_a, lon_b) ) %>% select(a_name, b_name, latitude, longitude, min.distance) %>% distinct(b_name, .keep_all = TRUE) %>% # 确保每个b_name唯一 arrange(match(b_name, c("kangseo", "kangbook", "jongro", "dongmoon", "jamsil", "nolboo", "ilsan")))
查看结果
运行以下代码输出整理后的数据(空值显示为空白):
print(clean_data, na.print = "")
输出结果与你的预期一致:
a_name b_name latitude longitude min.distance jongthree kangseo 37.1562 126.9762 73.950928 kangbook 38.1255 126.1952 128.179185 jongone jongro 38.1241 126.1215 95.626161 jongtwo dongmoon 37.1161 127.1345 12.531519 jongfive jamsil 36.1515 127.9627 175.154161 nolboo 37.3213 127.3211 85.151616 jongfour ilsan 37.1551 127.6262 17.124115
内容的提问来源于stack exchange,提问作者kangyeop
相关产品推荐
相关产品推荐

