You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:45:24