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

基于Vessel_ID识别两个DataFrame的行增减并生成标记结果

解决方案

一、生成标记增减行的df3

核心思路是通过setdiff精准定位新旧版本独有的Vessel_ID,分别标记删除/新增后合并结果:

# 1. 提取df1独有的Vessel_ID(对应需删除的行)
remove_rows <- df1[df1$Vessel_ID %in% setdiff(df1$Vessel_ID, df2$Vessel_ID), ]
remove_rows$add_remove <- "remove"

# 2. 提取df2独有的Vessel_ID(对应需新增的行)
add_rows <- df2[df2$Vessel_ID %in% setdiff(df2$Vessel_ID, df1$Vessel_ID), ]
add_rows$add_remove <- "add"

# 3. 合并生成df3并调整列顺序
df3 <- rbind(remove_rows, add_rows)
df3 <- df3[, c("Name", "Vessel_ID", "special_NO", "add_remove")]

运行后得到的df3与你期望的输出完全一致:

Name Vessel_ID special_NO add_remove
2  Vessel2         2         20     remove
4  Vessel4         4         40     remove
2        x         6         NA        add
3        y         7         NA        add
6  Vessel6        10         NA        add

二、匹配Vessel_ID时用df1的special_NO替换df2中的NA

提供两种实现方式,按需选择:

基础R实现

# 合并df2与df1的Vessel_ID和special_NO字段
merged_df <- merge(df2, df1[, c("Vessel_ID", "special_NO")], 
                   by = "Vessel_ID", suffixes = c("_df2", "_df1"), 
                   all.x = TRUE)
# 替换NA:优先取df1的special_NO,无匹配则保留原df2值
merged_df$special_NO <- ifelse(is.na(merged_df$special_NO_df2), 
                               merged_df$special_NO_df1, 
                               merged_df$special_NO_df2)
# 清理冗余列
merged_df <- merged_df[, c("Name", "Vessel_ID", "special_NO")]

dplyr实现(更简洁)

library(dplyr)

updated_df2 <- df2 %>%
  left_join(df1[, c("Vessel_ID", "special_NO")], by = "Vessel_ID") %>%
  mutate(special_NO = coalesce(special_NO.x, special_NO.y)) %>%
  select(Name, Vessel_ID, special_NO)

运行后,updated_df2中匹配Vessel_ID的行(如Vessel1、Vessel3、Vessel5)的special_NO会被df1的值替换,未匹配行保留NA。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:11:20