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

R语言中基于colour_match有效列动态合并两个data frame

按动态非NA键合并两个数据框

要实现根据colour_match每行的非NA列作为匹配键,为person_pet添加favourite_colour列,可按以下步骤操作:

1. 定义原始数据框

person_pet 数据框

first_name <- c("Nick", "Emily", "Joe", "Kate", "Kate", "Nick", "Joe")
last_name <- c("Smith", "Doe", "Lee", "Jackson", "Deng", "Smith", "Lee")
age <- c(28, 30, 52, 18, 42, 28, 52)
pet <- c("Cat", "Dog", "Rabbit","Cat", "Mouse", "Snake", "Bird")

person_pet <- data.frame(first_name, last_name, age, pet)

colour_match 数据框

first_name <- c("Emily","Nick", "Kate", "Joe", "Kate")
last_name <- c("Doe", "Smith", NA, "Lee", NA)
age <- c(NA, NA, 42, 52, 29)
favourite_colour <- c("black", "yellow", "red", "green", "white")

colour_match <- data.frame(first_name, last_name, age, favourite_colour)

2. 动态匹配合并实现

由于colour_match每行的有效匹配键不固定,我们可以逐行提取非NA列作为匹配键,分别完成匹配后合并结果:

使用dplyr实现(直观易读)

library(dplyr)

# 为每行标记有效匹配键
colour_match <- colour_match %>%
  rowwise() %>%
  mutate(
    key_cols = list(c(
      if(!is.na(first_name)) "first_name",
      if(!is.na(last_name)) "last_name",
      if(!is.na(age)) "age"
    ))
  ) %>%
  ungroup()

# 初始化结果数据框
result <- person_pet %>%
  mutate(favourite_colour = NA_character_)

# 逐行匹配并更新颜色列
for(i in seq_len(nrow(colour_match))) {
  current_row <- colour_match[i, ]
  match_keys <- current_row$key_cols[[1]]
  
  result <- result %>%
    left_join(
      current_row %>% select(all_of(c(match_keys, "favourite_colour"))),
      by = match_keys,
      suffix = c("", "_temp")
    ) %>%
    mutate(
      favourite_colour = coalesce(favourite_colour_temp, favourite_colour)
    ) %>%
    select(-favourite_colour_temp)
}

# 查看最终结果
print(result)

使用data.table实现(高效适用于大数据)

library(data.table)

setDT(person_pet)
setDT(colour_match)

# 复制原始数据框用于更新
result <- copy(person_pet)
result[, favourite_colour := NA_character_]

# 逐行匹配更新
for(i in seq_len(nrow(colour_match))) {
  current_row <- colour_match[i, ]
  # 提取当前行的非NA键(排除favourite_colour)
  match_keys <- names(current_row)[!is.na(current_row) & names(current_row) != "favourite_colour"]
  
  # 按键匹配并更新颜色
  result[current_row, on = match_keys, favourite_colour := i.favourite_colour]
}

print(result)

结果说明

运行代码后将得到符合需求的合并结果:

  • Nick Smith通过first_name+last_name匹配,favourite_colour为yellow
  • Emily Doe通过first_name+last_name匹配,favourite_colour为black
  • Joe Lee(age=52)通过first_name+last_name+age匹配,favourite_colour为green
  • Kate Deng(age=42)通过first_name+age匹配,favourite_colour为red
  • 其余未匹配的行(如Kate Jackson、Nick Smith(age=28))的favourite_colour保持NA

内容的提问来源于stack exchange,提问作者Dorisacat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:32:21