分类变量数据框的排序、匹配与补全:多数据框唯一值对齐需求
解决方案:按唯一值对齐多数据集行
你的需求是将多个数据集中的字段值按唯一值分组,同一值出现在多个数据集时放在同一行,其余列填充NA。原代码按number(行号)合并会导致行错位,因为行号是每个数据集内部的序号,和字段值无关。以下是实现方法:
方法一:重新构造数据并转置(推荐)
直接从原始字段列表出发,构造带数据集标识的结构,再转置得到目标格式:
library(tidyverse) # 定义原始字段列表 db_a <- c("name", "dob", "healthstatus") db_b <- c("name", "sanitation", "height", "weight") db_c <- c("dob", "adiposity") db_d <- c("healthstatus", "adiposity", "postcode", "match", "doornum") # 将每个数据集转换为「字段值-数据集来源」的结构 all_fields <- bind_rows( tibble(value = db_a, source = "db_a"), tibble(value = db_b, source = "db_b"), tibble(value = db_c, source = "db_c"), tibble(value = db_d, source = "db_d") ) # 转置为宽表,同一值的对应列填充自身,其余列NA result <- all_fields %>% pivot_wider( names_from = source, values_from = value, values_fill = NA ) %>% arrange(value) # 可选:按字段值排序
输出结果
# A tibble: 10 × 4 value db_a db_b db_c db_d <chr> <chr> <chr> <chr> <chr> 1 adiposity NA NA adiposity adiposity 2 dob dob NA dob NA 3 doornum NA NA NA doornum 4 healthstatus healthstatus NA NA healthstatus 5 height NA height NA NA 6 match NA NA NA match 7 name name name NA NA 8 postcode NA NA NA postcode 9 sanitation NA sanitation NA NA 10 weight NA weight NA NA
方法二:基于你已有的带number的数据集改造
如果需要基于你已创建的db_a-db_d(带number列)处理,先清理无效行再转换:
library(tidyverse) # 清理每个数据集,保留有效字段值并标记来源 clean_data <- bind_rows( db_a %>% filter(!is.na(db_a)) %>% mutate(value = db_a, source = "db_a"), db_b %>% filter(!is.na(db_b)) %>% mutate(value = db_b, source = "db_b"), db_c %>% filter(!is.na(db_c)) %>% mutate(value = db_c, source = "db_c"), db_d %>% filter(!is.na(db_d)) %>% mutate(value = db_d, source = "db_d") ) # 转置得到目标格式 result <- clean_data %>% pivot_wider( names_from = source, values_from = value, values_fill = NA ) %>% arrange(value)
核心逻辑说明
- 统一数据结构:将所有字段值和所属数据集绑定,明确每个值的来源。
- 转置宽表:用
pivot_wider将数据集名称转为列,同一字段值会自动合并到同一行,对应来源列填充字段值,其他列填充NA。
内容的提问来源于stack exchange,提问作者weatherboy
相关产品推荐
相关产品推荐

